1. 程式人生 > >記錄OkHttp上傳檔案

記錄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"%>
<!DOCTYPE HTML>
<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
這裡寫圖片描述
當我們在瀏覽器或者我們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檔案上傳詳解