1. 程式人生 > >如何使用OkHttp post傳遞文字和圖片

如何使用OkHttp post傳遞文字和圖片

在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 上傳圖片檔案

[java] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. publicclass UploadHelper extends Presenter {  
  2.     publicstaticfinal String TAG = "UploadHelper";  
  3.     privatestaticfinal MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");  
  4.     privatefinal OkHttpClient client = new OkHttpClient();  
  5.     public String upload(String imageType,String userPhone,File file) throws NetworkException{  
  6.         RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), file);  
  7.         RequestBody requestBody = new MultipartBody.Builder()  
  8.                 .setType(MultipartBody.FORM)  
  9. ///                .addPart(
  10. //                        Headers.of("Content-Disposition", "form-data; name=\"file\"; filename=\"" + fileName + "\""),
  11. //                        RequestBody.create(MEDIA_TYPE_PNG, file))
  12. //                .addPart(
  13. //                        Headers.of("Content-Disposition", "form-data; name=\"imagetype\""),
  14. //                        RequestBody.create(null, imageType))
  15. //                .addPart(
  16. //                        Headers.of("Content-Disposition", "form-data; name=\"userphone\""),
  17. //                        RequestBody.create(null, userPhone))
  18.                 .addFormDataPart("file""head_image", fileBody)  
  19.                 .addFormDataPart("imagetype", imageType)  
  20.                 .addFormDataPart("userphone", userPhone)  
  21.                 .build();  
  22.         Request request = new Request.Builder()  
  23.                 .url("http://xxxxx")  
  24.                 .post(requestBody)  
  25.                 .build();  
  26.         Response response;  
  27.         try {  
  28.             response = client.newCall(request).execute();  
  29.             String jsonString = response.body().string();  
  30.             Log.d(TAG," upload jsonString ="+jsonString);  
  31.             if(!response.isSuccessful()){  
  32.                 thrownew NetworkException("upload error code "+response);  
  33.             }else{  
  34.                 JSONObject jsonObject = new JSONObject(jsonString);  
  35.                 int errorCode = jsonObject.getInt("errorCode");  
  36.                 if(errorCode == 0){  
  37.                     Log.d(TAG," upload data ="+jsonObject.getString("data"));  
  38.                     return jsonObject.getString("data");  
  39.                 }else {  
  40.                     thrownew NetworkException("upload error code "+errorCode+",errorInfo="+jsonObject.getString("errorInfo"));  
  41.                 }  
  42.             }  
  43.         } catch (IOException e) {  
  44.             Log.d(TAG,"upload IOException ",e);  
  45.         }catch (JSONException e){  
  46.             Log.d(TAG,"upload JSONException ",e);  
  47.         }  
  48.         returnnull;  
  49.     }  

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

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

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


相關推薦

如何使用OkHttp post傳遞文字圖片

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

JAVA------20.圖片中插文字圖片

dap 圖片 logs test http 合成 over cal ray import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; im

ios24--改變button的文字圖片

nor center span 文本 init align log view lstat // // ViewController.m // 09-UIButton內部子控件的調整 // // Created by xiaomage on 15/12/30. //

jweixin-1.1.0.js微信接口“分享給朋友”文字圖片配置

數據 req fig 否則 通用 nonce log 形式 調用 在npm官網找到了:微信官方 js-sdk CommonJS 版https://www.npmjs.com/package/weixin-js-sdk 步驟一:引入JS文件在需要調用JS接口的頁面引入如下JS

jQuery怎麼獲取到富文字ueditor編輯器裡面的文字圖片內容

1、建立編輯器 UE.getEditor('editor', { initialFrameWidth:"100%" //初始化選項 }) 精簡版 UE.getEditor('editor') 2、刪除編輯器 UE.getEditor('editor').destroy(); 3、

C#呼叫系統預設印表機列印文字圖片

本方法適用於有列印驅動的印表機列印。直接用電腦預設印表機進行列印文字和圖片。 首先安裝印表機驅動,然後在裝置和印表機中將要用的印表機設為預設印表機,然後呼叫該方法即可 Pulic Void Print() { PrintService ps = new PrintService();

MFC入門(三)-- MFC圖片/文字控制元件(迴圈顯示文字圖片的小程式)

慣例附上前幾個部落格的連結: MFC入門(一)簡單配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入門(二)讀取輸入字元:http://blog.csdn.net/zmdsjtu/article/details/52315088 &

文字圖片垂直居中對齊

讓文字和圖片垂直居中對齊(經常會用的,但是記不住的佈局。。) 給img和文字所在的父容器設定如下css即可。 1.flex佈局 .box{ display:flex; align-items: center;//子元素垂直居中 justify-cont

一個方便快捷gif線上水印製作(支援文字圖片

有時候我們要給gif加上水印的確不太方便,需要獲取每一幀下來然後進行處理。 這個時候自己弄得話花費時間也長。 使用起來也很簡單,製作文字水印時候只需要上傳gif檔案就行,等待伺服器處理完成自動下載預覽。 製作圖片水印時候需要先傳圖片檔案(png,jpg),上傳成功後

Android免費的匯出微信朋友圈文字圖片的工具

                免費的匯出微信朋友圈文字和圖片的工具 很多人問:如何匯出微信朋友圈。於是,有各種解答,各種收費的軟體。但是都不太好。即使是收費的,也經常用不起,還花了錢。找到開源的東東,作一些適合的修改,就出現一個免費的了。因為裡面內建了微信的apk,用來hook,部分安全軟體會報毒。 手機需

資料庫中文字圖片的插入

//插入文字大資料     @Test     public void testClob() throws Exception{         String sq

asp 批量同時上傳文字圖片的實現。

先上程式碼: 表單部分: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http

在同一個div裡的文字圖片無法對齊

問題描述 在寫前端程式碼時發現在div中插入img標籤後,div中的文字會對齊img圖片的底端,就算設定了line-height也沒有用 解決方法 用css設定img的vertical-align

div中的文字圖片水平居中的方法

css文字水平居中的案例1: .page{text-align: center;} <div class="page"><p>這是需要水平居中的文字</p></div>css文字水平居中的案例2: .page{displa

Apache PdfBox 2.0.X 版本解析PDF文件(文字圖片

        最近專案開發過程涉及到了pdf檔案的內容的解析和和內容的提取入庫操作,其中pdf的解析採用了開源的apache pdfbox 外掛,版本選用的是最新版本的2.0.8版本,現將簡單的讀取解析的步驟記錄如下:            Apache下載連結如下:   

UITabBarItem不能顯示文字圖片

ViewController中加入UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@"Playlists" image:[UIImage imageNamed:@"music.png"] tag:0]; se

abap中選擇螢幕上新增按鈕,按鈕上新增文字圖片,並新增響應事件

**選擇螢幕SELECTION-SCREEN BEGIN OF BLOCK main WITH FRAME TITLE TEXT-001.PARAMETERS:p_matnr LIKE mara-matnr OBLIGATORY,           p_werks LIKE

reportlab使用示例:文字圖片

Python的reportlab專門將資料使用生成PDF中的圖形和文件功能, 下載ReportLab 生成一個簡單的helloworld from reportlab.graphics.shapes import Drawing, String from report

CSS3動畫實現高亮光弧效果,文字圖片(一閃而過)

前言   好久沒有寫部落格啦,高亮文字和圖片一閃而過的特效,用CSS3來寫  先看文字吧, 就上程式碼了 .shadow { /* 背景顏色線性漸變 */ /* 老式寫法 */ /* linear為線性漸變,也可以用下面的那種寫法。left top,right t

java-pdfbox2.0.8讀取pdf文字圖片

package per.qy.dexter.fileoperate; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java