记录OkHttp上传文件

理解文件上传我觉得还是需要一些JavaWeb方面的知识,比如什么是表单了,等等
博主先用现学了下,理解也不咋透彻,所以先记录下,有不对的欢迎指正。
先上一下文件上传的代码,代码参考地址
客户端Android代码:

okHttpClient = build();
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);
        //第一个参数要与Servlet中的一致
        builder.addFormDataPart("file", files.getName(), RequestBody.create(MediaType.parse("application/octet-stream"), files));
        MultipartBody multipartBody = builder.build();

        Request request = new Request.Builder().url(url).post(multipartBody).build();
        okHttpClient.newCall(request).enqueue(callback);

客户端代码我有两个疑问:

  1. 为什么用MultipartBody,这个MultipartBody是什么
  2. file是什么意思,为什么要跟Servlet中的一致

上面两个问题引出了这篇文章

服务器代码:

System.out.println("doPost==");
            request.setCharacterEncoding("utf-8");
            //获取file命名的part,注意要与Android端一样
            Part part = request.getPart("file");
            // 获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"
            String header = part.getHeader("content-disposition");
            System.out.println(header);
            String fileName = getFileName(header);
            // 存储路径
            String savePath = "/Users/apple/Documents";
            // 把文件写到指定路径
            part.write(savePath + File.separator + fileName);
            response.setCharacterEncoding("UTF-8");
            PrintWriter writer = response.getWriter();
            writer.print("上传成功");

这个file就相当于表单里面的字段,一般写到jsp里面。

<%@ page language="java" pageEncoding="UTF-8"%>

<html>
  <head>
    <title>文件上传title>
  head>

  <body>
    <form action="${pageContext.request.contextPath}/servlet/UploadHandleServlet" enctype="multipart/form-data" method="post">
        上传用户:<input type="text" name="username"><br/>
        上传文件1:<input type="file" name="file1"><br/>
        上传文件2:<input type="file" name="file2"><br/>
        <input type="submit" value="提交">
    form>
  body>
html>

type为file
记录OkHttp上传文件_第1张图片
当我们在浏览器或者我们Android客户端,上传文件的时候,要和表单的file对应上,所以,builder.addFormDataPart("file", files.getName(), RequestBody.create(MediaType.parse("application/octet-stream"), files));这句话要把file加上。


MultipartBody
我们提交普通键值对类型表单的时候Content-Type默认为application/x-www-form-urlencoded,在OkHttp中可以使用FormBody.Builder去提交该种类表单。
当我们提交文件的时候Content-Type应该为multipart/form-data
四种常见的 POST 提交数据方式
Multipart/form-data POST文件上传详解

你可能感兴趣的:(Android)