okhttp檔案及資料同時上傳

2021-07-25 01:11:59 字數 2187 閱讀 3812

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

1.multipart/form-data 解釋

因為在進行上傳檔案的操作的時候,有些公共的api 會要求header 的上傳格式 ,所以需要具體了解下相關格式的含義,以便更加精確的了解。下面是摘錄的一段(

[二進位制資料]

–zngpdtepmx0krhh_g0x99yef9r8jzsrjsxc–

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

選擇了這個邊界之後,瀏覽器便把它放在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 elseelse 

}} catch (ioexception e) catch (jsonexception e)

return null;

}

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

.addpart( 

headers.of(「content-disposition」, 「form-data; name=\」token\」「), 

requestbody.create(null, uploadtoken))

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

3.相關的參考的部落格

Controller上傳多檔案的同時上傳Vo物件

需要傳檔案就要用form data apioperation 新增操作記錄 value addone public jianjingdto addone requestpart msg string msg,requestpart files list files 內部使用 requestpart註...

同時上傳多個檔案問題

需求描述 每件儀器會有附件,而且不止乙個。我們需要在上傳儀器的時候,提供上傳附件的方法。難點 前端同時儲存多個檔案比較麻煩而且比較容易出錯,但是如果每上傳一次,就儲存一次資料庫,會導致資料庫裡大量的無用檔案 因為使用者在上傳檔案之後不一定會上傳此儀器,導致之前存在資料庫裡的檔案變為了無用檔案 解決方...

C 檔案上傳同時附帶引數上傳

使用下面的方法就可以在上傳檔案的同時附帶請求引數傳遞。方法內的部分請求引數可能需要修改。檔案上傳 檔案路徑 其他引數鍵值集合 響應資料 寫入字串的key var stringkeyheader r n boundary r ncontent disposition form data name r ...