#iOS AF上傳圖片引發的血案
AF帶來的血案
已上圖是AF原始碼截圖,基於表單的形式上傳。使用的是multipart/form-data傳送檔案。
Content-Type必須是multipart/form-data
原理分析
以multipart/form-data編碼的POST請求格式與application/x-www-form-urlencoded完全不同.
其中application/x-www-form-urlencoded提交的資料按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。然而multipart/form-data是這樣的形式:
key1 = val1
key2 = vals
關於 multipart/form-data 的詳細定義,請前往 rfc1867 檢視。http://www.ietf.org/rfc/rfc1867.txt
例子
<pre>
POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=XXX
此處有有空格*
--XXX
Content-Disposition: form-data; name="text"
title
--XXX
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
此處有有空格*
PNG ... content of chrome.png ...
--XXX
</pre>
例子說明
首先生成了一個 boundary=XXX 用於分割不同的欄位,為了避免與正文內容重複,boundary 可能會很長很複雜。然後 Content-Type 裡指明瞭資料是以 multipart/form-data 來編碼。
訊息主體裡按照欄位個數又分為多個結構類似的部分,每部分都是以 --boundary 開始,緊接著是內容描述資訊,然後是回車,最後是欄位具體內容(文字或二進位制)。
如果傳輸的是檔案,還要包含檔名和檔案型別資訊。
訊息主體最後以 --boundary-- 標示結束。
iOS多圖片上傳
<pre>
/**
- 上傳圖片
- @param operations 上傳圖片等預留引數---視具體情況而定 可移除
- @param imageArray 上傳的圖片陣列
- @parm width 圖片要被壓縮到的寬度
- @param urlString 上傳的url---請填寫完整的url
- @param successBlock 上傳成功的回撥
- @param failureBlock 上傳失敗的回撥
- @param progress 上傳進度
*/
+(void)uploadImageWithOperations:(NSDictionary *)operations withImageArray:(NSArray *)imageArray withtargetWidth:(CGFloat )width withUrlString:(NSString *)urlString withSuccessBlock:(requestSuccess)successBlock withFailurBlock:(requestFailure)failureBlock withUpLoadProgress:(uploadProgress)progress;
{
//1.建立管理者物件
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager POST:urlString parameters:operations constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
NSUInteger i = 0 ;
/**出於效能考慮,將上傳圖片進行壓縮*/
for (UIImage * image in imageArray) {
//image的分類方法
UIImage * resizedImage = [UIImage IMGCompressed:image targetWidth:width];
NSData * imgData = UIImageJPEGRepresentation(resizedImage, .5);
//拼接data
[formData appendPartWithFileData:imgData name:[NSString stringWithFormat:@"picflie%ld",(long)i] fileName:@"image.png" mimeType:@" image/jpeg"];
i++;
}
} progress:^(NSProgress * _Nonnull uploadProgress) {
progress(uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
} success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary * _Nullable responseObject) {
successBlock(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failureBlock(error);
}];
}
</pre>
擴充套件
四種常見的 POST 提交資料方式:以上兩種 + application/json + text/xml
參考
1.http://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
2.https://imququ.com/post/four-ways-to-post-data-in-http.html#toc-2
相關文章
- android選擇圖片或拍照圖片上傳到伺服器(包括上傳引數)Android伺服器
- 上傳圖片
- .Net版本引發的血案
- Retrofit+RxJava上傳圖片上傳圖片到後臺RxJava
- 實戰:圖片上傳元件開發元件
- 【easyui 】上傳圖片UI
- 上傳圖片jsJS
- PbootCMS上傳圖片變模糊、上傳圖片尺寸受限的解決方案boot
- 圖片上傳及圖片處理
- curl上傳圖片的大坑
- RestTemplate超時引發的血案REST
- JDBC亂碼引發的"血案"JDBC
- SwipeRefreshLayout 引發的一場血案
- iOS下html上傳圖片被旋轉問題iOSHTML
- php圖片上傳之圖片轉換PHP
- java,springboot + thymeleaf 上傳圖片、刪除圖片到伺服器、本地,壓縮圖片上傳(有些圖片會失真),原圖上傳JavaSpring Boot伺服器
- 前端手勢控制圖片外掛書寫四(圖片上傳及Ios圖片方向問題)前端iOS
- iOS土味兒講義(一)--一個Button引發的血案iOS
- 多圖片formpost上傳ORM
- input file圖片上傳
- PHP上傳圖片類PHP
- 圖片檔案上傳
- 測試圖片上傳
- iOS 圖片上新增水印iOS
- ci框架中的圖片上傳框架
- mino如何上傳同名的圖片
- iOS圖片,視訊上傳&視訊內容旋轉iOS
- vue watch陣列引發的血案Vue陣列
- _nop_()函式引發的血案函式
- vue 上傳圖片進行壓縮圖片Vue
- Ueditor 上傳圖片自動新增水印(只能上傳圖片,上傳檔案報錯)
- 學姐,影片上傳不了,我上傳了圖片
- 小程式開發:上傳圖片到騰訊雲
- Java實現圖片上傳到伺服器,並把上傳的圖片讀取出來Java伺服器
- Laravel 使用 FastDFS 上傳圖片LaravelAST
- koa 圖片上傳詳解
- Vue圖片裁剪上傳元件Vue元件
- 圖片上傳方案詳解