1. 程式人生 > >okhttp常規用法和上傳檔案(multipart/form-data的學習)

okhttp常規用法和上傳檔案(multipart/form-data的學習)

在app 中,最基本的設定使用者頭像,需要進行頭像的圖片上傳,那就會使用到 post 進行上傳檔案的操作。必然要了解下 Multipart/form-data 的含義。以前在寫這部分程式碼的時候,不理解Headers.of(xxx)什麼意思,而且 裡面填寫的格式又有什麼要求代表了什麼意思 等。

這裡寫圖片描述

看到上面的api 的說明文件更是頭大,所以需要了解下 Multipart/form-data

1.Multipart/form-data 解釋

  • 1.1 什麼是 Multipart/form-data: 
    Multipart/form-data是上傳檔案的一種方式,是瀏覽器用表單上傳檔案的方式

  • 1.2 Multipart/form-data 上傳步驟:

     
    首先,客戶端和伺服器建立連線(TCP協議)。 
    第二,客戶端可以向伺服器端傳送資料。因為上傳檔案實質上也是向伺服器端傳送請求。 
    第三,客戶端按照符合“multipart/form-data”的格式向伺服器端傳送資料。(這一點非常重要)。

  • 1.3 Multipart/form-data 上傳格式的說明:

這裡是相關請求頭的資訊:

POST /t2/upload.do HTTP/1.1 
User-Agent: SOHUWapRebot 
Accept-Language: zh-cn,zh;q=0.5 
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.7 
Connection: keep-alive 
Content-Length: 60408 
Content-Type:multipart/form-data; boundary=ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC 
Host: w.sohu.com

–ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC 
Content-Disposition: form-data;name=”desc” 
Content-Type: text/plain; charset=UTF-8 
Content-Transfer-Encoding: 8bit

[……][……][……][……]……………………… 
–ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC 
Content-Disposition: form-data;name=”pic”; filename=”photo.jpg” 
Content-Type: application/octet-stream 
Content-Transfer-Encoding: binary

[圖片二進位制資料] 
–ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC–

我們來分析下資料,第一個空行之前自然還是HTTP header,之後則是Entity,而此時的Entity也比之前要複雜一些。根據RFC 1867定義,我們需要選擇一段資料作為“分割邊界”( boundary屬性),這個“邊界資料”不能在內容其他地方出現,一般來說使用一段從概率上說“幾乎不可能”的資料即可。 不同瀏覽器的實現不同,例如火狐某次post的 boundary=—————————32404670520626 , opera為boundary=———-E4SgDZXhJMgNE8jpwNdOAX ,每次post瀏覽器都會生成一個隨機的30-40位長度的隨機字串,瀏覽器一般不會遍歷這次post的所有資料找到一個不可能出現在資料中的字串,這樣代價太大了。一般都是隨機生成,如果你遇見boundary值和post的內容一樣,那樣的話這次上傳肯定失敗,不過我建議你去買彩票,你太幸運了。Rfc1867這樣說明{A boundary is selected that does not occur in any of the data. (This selection is sometimes done probabilisticly.)}。

選擇了這個邊界之後,瀏覽器便把它放在Content-Type 裡面傳遞給伺服器,伺服器根據此邊界解析資料。下面的資料便根據boundary劃分段,每一段便是一項資料。(每個field被分成小部分,而且包含一個value是”form-data”的”Content-Disposition”的頭部;一個”name”屬性對應field的ID,等等,檔案的話包括一個filename) 
IE和Chrome在filename的選擇策略上有所不同,前者是檔案的完整路徑,而後者則僅僅是檔名。 
資料內容以兩條橫線結尾,並同樣以一個換行結束。在網路協議中一般都以連續的CR、LF(即\r、\n,或0x0D、Ox0A)字元作為換行,這與Windows的標準一致。如果您使用其他作業系統,則需要考慮它們的換行符。 
另外Content-length 指的是所用資料的長度。

2.okhttp post 上傳圖片檔案

public class UploadHelper extends Presenter {

    public static final String TAG = "UploadHelper";
    private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
    private final OkHttpClient client = new OkHttpClient();

    public String upload(String imageType,String userPhone,File file) throws NetworkException{

        RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), file);

        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
///                .addPart(
//                        Headers.of("Content-Disposition", "form-data; name=\"file\"; filename=\"" + fileName + "\""),
//                        RequestBody.create(MEDIA_TYPE_PNG, file))
//                .addPart(
//                        Headers.of("Content-Disposition", "form-data; name=\"imagetype\""),
//                        RequestBody.create(null, imageType))
//                .addPart(
//                        Headers.of("Content-Disposition", "form-data; name=\"userphone\""),
//                        RequestBody.create(null, userPhone))

                .addFormDataPart("file", "head_image", fileBody)
                .addFormDataPart("imagetype", imageType)
                .addFormDataPart("userphone", userPhone)
                .build();

        Request request = new Request.Builder()
                .url("http://xxxxx")
                .post(requestBody)
                .build();

        Response response;
        try {
            response = client.newCall(request).execute();
            String jsonString = response.body().string();
            Log.d(TAG," upload jsonString ="+jsonString);

            if(!response.isSuccessful()){
                throw new NetworkException("upload error code "+response);
            }else{
                JSONObject jsonObject = new JSONObject(jsonString);
                int errorCode = jsonObject.getInt("errorCode");
                if(errorCode == 0){
                    Log.d(TAG," upload data ="+jsonObject.getString("data"));
                    return jsonObject.getString("data");
                }else {
                    throw new NetworkException("upload error code "+errorCode+",errorInfo="+jsonObject.getString("errorInfo"));
                }
            }

        } catch (IOException e) {
            Log.d(TAG,"upload IOException ",e);
        }catch (JSONException e){
            Log.d(TAG,"upload JSONException ",e);
        }
        return null;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

addPart 就是傳送頭部的具體內容了,其中 addFormDataPart 封裝了部分內容,本質上 和

.addPart( 
Headers.of(“Content-Disposition”, “form-data; name=\”token\”“), 
RequestBody.create(null, uploadToken))

道理是一樣的,只是內部進行了自己的封裝。下面是相關的原始碼

這裡寫圖片描述

3.相關的參考的部落格

相關推薦

okhttp常規用法檔案multipart/form-data學習

在app 中,最基本的設定使用者頭像,需要進行頭像的圖片上傳,那就會使用到 post 進行上傳檔案的操作。必然要了解下 Multipart/form-data 的含義。以前在寫這部分程式碼的時候,不理解Headers.of(xxx)什麼意思,而且 裡面填寫的格式又有什麼要求代表了什麼意思 等。 看到

okhttp post 檔案以及Multipart/form-data學習理解

在app 中,最基本的設定使用者頭像,需要進行頭像的圖片上傳,那就會使用到 post 進行上傳檔案的操作。必然要了解下 Multipart/form-data 的含義。以前在寫這部分程式碼的時候,不理解Headers.of(xxx)什麼意思,而且 裡面填寫的格式

Spring MVC 4 使用常規的fileupload檔案帶原始碼

package com.websystique.springmvc.controller; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; impor

curl傳送請求檔案multipart file upload

折騰一下午的問題 第三方介面需要我們傳multipart 上傳檔案 curl一直各種試不成功,用Restlet Client工具總是能成功! 對比傳送的頭,發現工具在Content-Type: multipart/form-data;後面多了個這個boundary 然後去查了下

Python模擬瀏覽器檔案指令碼Multipart/form-data格式

http協議本身的原始方法不支援multipart/form-data請求,這個請求由原始方法演變而來的。 multipart/form-data的基礎方法是post,也就是說是由post方法來組合實現的,與post方法的不同之處:請求頭,請求體。 mult

關於ajax 圖片 enctype="multipart/form-data"的問題

該屬性為提交表單瀏覽器對資料的編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,預設為application/x-www-form-urlencoded。 當action為get時候,瀏覽器用x-www-form-urlencod

Windows如何連線linux檔案到linuxsecurcrt

一般開發在Windows,部署專案在linux這個時候就要選一個方便的軟體可以將專案扔到linux上去了,securcrt.這個軟體很好實用 網上很多免安裝版的,開啟即用,首先是連線linux 這個就不說  輸入公網ip 使用者名稱 密碼就可以   SecureCRTPo

SpringMVC_20_使用HttpMessageConverter T 實現了檔案不推薦下載檔案操作

使用HttpMessageConverter< T>將請求資訊轉化並繫結到處理方法的入參中或將響應結果轉化為對應型別的響應資訊,Spring提供了兩種途徑: 使用@RequestBody/@ResponseBody對處理方法進行標註 使用Ht

ftp 站點的建立實現檔案下載 以及 ftp沒有許可權檔案錯誤:200 Type set to I

當你已經配置好iis.步驟:一:隨便在一個盤下建立一個檔案bb(檔名可以自己取)我的在:D:\bb二:進入iis接著:接著下一步:接著下一步:然後點選完成三:進入D:\bb,新建一個資料夾開啟瀏覽器,輸入ftp:://10.203.68.51:45  其中45是我設定的埠號,

Ajax 檔案input file FormData

FormData物件用以將資料編譯成鍵值對,以便用XMLHttpRequest來發送資料。其主要用於傳送表單資料,但亦可用於傳送帶鍵資料(keyed data),而獨立於表單使用。 jQuery Ajax 上傳檔案 通過 Ajax 向後臺傳送檔案(包括圖片)時,其引數型別屬於物件。可以建立一個 FormD

springboot/springmvc檔案CommonsMultipartResolver

上一篇博文講到了(Servlet3.0支援)的檔案上傳:https://blog.csdn.net/frozenpower/article/details/81141297 這篇我們來看可配置的檔案上傳解析器CommonsMultipartResolver CommonsMultipartR

根據request,檔案使用Spring CommonsMultipartResolver 檔案

/**      * 根據request,獲取上傳的非結構化資料      * 備註:非結構化資料會儲存臨時檔案,並返回臨時檔案路徑的集合      *      

阿里雲 javascript檔案圖片、視訊、壓縮包等檔案到 物件儲存 OSS ,返回檔案、圖片、音訊、視訊等URL路徑

目的:前端上傳檔案(圖片、視訊、音訊等)到阿里雲伺服器裡面,並且獲得上傳檔案的URL路徑 前提:首先要買一個阿里雲伺服器,自己百度不會; 第一步:登入阿里雲賬號,點選管理控制檯-->物件儲存 OSS 第二步:新建儲存空間(圖一、圖二) (圖一) (圖二

非同步檔案formDate)

var oMyForm = new FormData(); oMyForm.append("username", "Groucho"); oMyForm.append("accountnum", 123456); oMyForm.append("file", $('#file')[0].fil

SpringMVC檔案圖片並儲存到本地

SpringMVC上傳檔案(圖片)並儲存到本地 小記一波~ 基本的MVC配置就不展示了,這裡給出核心程式碼 在spring-mvc的配置檔案中寫入如下配置 <bean id="multipartResolver" class="org.springframewor

java 通過SFTP連線,獲取指定目錄檔案檔案

import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import co

javaWeb檔案jsp檔案

jsp頁面: 使用者名稱: 檔案: 後臺servlet頁面 package com.upload.servlet; import java.io.File; import java.io.IOException; i

beego傳送郵件檔案介面

本文主要介紹採用beego框架的郵件傳送和檔案上傳介面 傳送郵件用到"gopkg.in/gomail.v2"包 在models中定義好請求引數模型和返回結果模型 type SmtpRecv struct { From string `json:"from"`

使用表單檔案

先寫一個簡單的表單,根據上一篇文章說的步驟進行 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCT

C# 檔案防止記憶體溢位

public static string MyUploader(string strFileToUpload, string strUrl,Action<double,double> uploading) { string strFileF