iOS開發網絡篇—文件的上傳

說明:文件上傳使用的時POST請求,通常把要上傳的數據保存在請求體中。本文介紹如何不借助第三方框架實現iOS開發中得文件上傳。

  由于過程較為復雜,因此本文只貼出部分關鍵代碼。

主控制器的關鍵代碼:

YYViewController.m

 1 #import "YYViewController.h"
 2 
 3 #define YYEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding]
 4 
 5 @interface YYViewController ()
 6 
 7 @end
 8 
 9 @implementation YYViewController
10 
11 - (void)viewDidLoad
12 {
13     [super viewDidLoad];
14     // Do any additional setup after loading the view, typically from a nib.
15 }
16 
17 - (void)upload:(NSString *)name filename:(NSString *)filename mimeType:(NSString *)mimeType data:(NSData *)data parmas:(NSDictionary *)params
18 {
19     // 文件上傳
20     NSURL *url = [NSURL URLWithString:@"http://192.168.1.200:8080/YYServer/upload"];
21     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
22     request.HTTPMethod = @"POST";
23     
24     // 設置請求體
25     NSMutableData *body = [NSMutableData data];
26     
27     /***************文件參數***************/
28     // 參數開始的標志
29     [body appendData:YYEncode(@"--YY\r\n")];
30     // name : 指定參數名(必須跟服務器端保持一致)
31     // filename : 文件名
32     NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", name, filename];
33     [body appendData:YYEncode(disposition)];
34     NSString *type = [NSString stringWithFormat:@"Content-Type: %@\r\n", mimeType];
35     [body appendData:YYEncode(type)];
36     
37     [body appendData:YYEncode(@"\r\n")];
38     [body appendData:data];
39     [body appendData:YYEncode(@"\r\n")];
40     
41     /***************普通參數***************/
42     [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
43         // 參數開始的標志
44         [body appendData:YYEncode(@"--YY\r\n")];
45         NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n", key];
46         [body appendData:YYEncode(disposition)];
47 
48         [body appendData:YYEncode(@"\r\n")];
49         [body appendData:YYEncode(obj)];
50         [body appendData:YYEncode(@"\r\n")];
51     }];
52     
53     /***************參數結束***************/
54     // YY--\r\n
55     [body appendData:YYEncode(@"--YY--\r\n")];
56     request.HTTPBody = body;
57     
58     // 設置請求頭
59     // 請求體的長度
60     [request setValue:[NSString stringWithFormat:@"%zd", body.length] forHTTPHeaderField:@"Content-Length"];
61     // 聲明這個POST請求是個文件上傳
62     [request setValue:@"multipart/form-data; boundary=YY" forHTTPHeaderField:@"Content-Type"];
63     
64     // 發送請求
65     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
66         if (data) {
67             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
68             NSLog(@"%@", dict);
69         } else {
70             NSLog(@"上傳失敗");
71         }
72     }];
73 }
74 
75 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
76 {
77     // Socket 實現斷點上傳
78     
79     //apache-tomcat-6.0.41/conf/web.xml 查找 文件的 mimeType
80 //    UIImage *image = [UIImage imageNamed:@"test"];
81 //    NSData *filedata = UIImagePNGRepresentation(image);
82 //    [self upload:@"file" filename:@"test.png" mimeType:@"image/png" data:filedata parmas:@{@"username" : @"123"}];
83     
84     // 給本地文件發送一個請求
85     NSURL *fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt" withExtension:nil];
86     NSURLRequest *request = [NSURLRequest requestWithURL:fileurl];
87     NSURLResponse *repsonse = nil;
88     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&repsonse error:nil];
89     
90     // 得到mimeType
91     NSLog(@"%@", repsonse.MIMEType);
92     [self upload:@"file" filename:@"itcast.txt" mimeType:repsonse.MIMEType data:data parmas:@{
93                                                                                               @"username" : @"999",
94                                                                                               @"type" : @"XML"}];
95 }
96 
97 @end

補充說明:

文件上傳請求數據格式

部分文件的MIMEType

轉載于:https://www.cnblogs.com/zengshuilin/p/5764419.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374153.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

var模型的matlab實現_Eviews中VAR模型的操作、脈沖響應分析和方差分解的實現

打開文件所在位置,獲取數據。選中變量右鍵open打開var操作EViews,在VAR對象的工具欄中選擇“View”|“Lag Structure”|“AR Roots Table/ AR Roots Graph”選項,得到AR根的表和圖。結果顯示:VAR模型所有根模的倒數都小于1,即都在…

一個程序員的愛情表白書

我能抽象出整個世界 但是我不能抽象出你 因為你在我心中是那么的具體 所以我的世界并不完整 我可以重載甚至覆蓋這個世界里的任何一種方法 但是我卻不能重載對你的思念 也許命中注定了 你在我的世界里永遠的烙上了靜態的屬性 而我不慎調用了愛你這個方法 當我義無返顧的…

結構體、枚舉類型

一、結構體 結構體:就是一個自定義的集合,里面可以放各種類型的元素,用法大體跟集合一樣。 1、定義的方法: struct student { public int nianling; public int fenshu; public string name; public string sex; public int sum; …

NXP KW38開發雜記(一)MCUXpress 運行進入NMI_Handler

這里是大佬的具體分析過程,感興趣可以看看 https://www.cnblogs.com/wenhao-Web/p/13618703.html 解決辦法: 在startup_mkw38a4.c文件里,定位到Flash_Config {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE}; 把最后一個參數0xFFFFFFFE改…

25個讓Java程序員更高效的Eclipse插件

Eclipse提供了一個可擴展插件的開發系統。這就使得Eclipse在運行系統之上可以實現各種功能。這些插件也不同于其他的應用(插件的功能是最難用代碼實現的)。擁有合適的Eclipse插件是非常重要的,因為它們能讓Java開發者們無縫的開發基于J2EE和服…

NXP KW38藍牙開發(一)入門第一課:官網藍牙廣播和連接例程,NMI禁止

首先要下載開發使用的IDE:MCUXpresso IDE 下載鏈接: 進入nxp的官網,搜索KW38 向下翻看,找到Xpresso,點擊進入 習慣使用IAR開發的同學也可以下IAR版本,這里以Xpresso為例 下載好后安裝,一路默…

rough and crude

rough:物理上的粗糙或者說不平,高爾夫球場的生草區 crude:原始、未經加工的那種粗,即沒有精加工轉載于:https://www.cnblogs.com/dgyw/p/5767078.html

views 多個文件夾 netcore_.NET Core中的使用Kestrel服務器理解及應用

Kestrel是一個基于libuv的跨平臺.NET Core web服務器,libuv是一個跨平臺的異步I/O庫。ASP.NET Core模板項目使用Kestrel作為默認的web服務器。Kestrel支持以下功能:HTTPS用于啟用不透明升級的WebSockets位于Nginx之后的高性能Unix socketsKestrel 被.NET…

使用PowerMock測試對象的內部狀態

大多數單元測試都集中于測試對象的行為以證明其有效。 這可以通過編寫一個JUnit測試來實現,該測試調用對象的公共方法,然后測試這些調用的返回值是否與先前定義的一組期望值匹配。 這是一種非常常見且成功的技術。 但是,不應忘記對象也顯示狀…

布局

1)ul li 把ul寬度設置大一點,然后overflowhidden;(最好不要嵌套使用,原因看清除浮動方法),然后外面必須有包裹的div殼,div殼的寬度就按設計稿來,這樣就避免了需要給最后一個li設置m…

10個職場故事,讓人不得不看

1、強盜師徒 有一次,一個老強盜帶著徒弟去搶劫銀行,被警方追捕。兩人狂逃,差點兒連褲子都跑掉了。好不容易甩掉了警察,兩人上氣不接下氣,癱倒在地上。 良久,驚魂稍定,徒弟說:“師父啊師父&#…

NXP UWB NCJ29D5開發(一)環境搭建

1、從NXP的共享賬號下載資料 共享賬號需要找對接的NXP人員拿到,他會把資料分享到這個賬號,在這個賬號里面可以下載 進入nxp官網,登錄后點擊my nxp,選擇Software Licensing and Support 進入后接著選擇View accounts 進入后選擇…

西瓜創客python編程進階收費_西瓜創客和編程貓有什么不同?哪個更值得報名?...

看情況來決定即可,在課程內容上其實出入我覺得不是很大,重點是教學服務、師資、授課模式等,單純我自己的角度來說,我個人偏向于西瓜創客多一點,他們家的課程更具有趣味性,游戲化教學,融入卡通人…

Stack的三種含義

作者:阮一峰 學習編程的時候,經常會看到stack這個詞,它的中文名字叫做”棧”。 理解這個概念,對于理解程序的運行至關重要。容易混淆的是,這個詞其實有三種含義,適用于不同的場合,必須加以區分。…

NXP UWB NCJ29D5開發(二)BlinkyLed例程

路徑為UWB\NCJ29D5\NCJ29D5_CAS_Examples_v1.4\onic\BlinkyLed\toolsupport\keil 例程怎么來的可以看看上一篇NXP UWB NCJ29D5開發(一)環境搭建 1、 //系統選擇外部晶振,時鐘頻率為55.2Mhz phscaAppHal_Init(PHSCA_APPHAL_XO_CLOCK_SOURCE_…

你要看透的56條人生哲理

當你躊躇不前、站在人生十字路口時候,這56條哲理或許能助你一臂之力!      1.拿得起,放得下      我們每個人都有很多“寶貝”,但你不可能什么都得到,在某些時候一定要學會拿得起,放得下…

使用Spring和Java泛型簡化數據訪問層

1.概述 本文將著重于通過對系統中的所有實體使用單個通用的數據訪問對象來簡化DAO層 ,這將導致優雅的數據訪問 ,而不會造成不必要的混亂或冗長。 2. Hibernate和JPA DAO 大多數生產代碼庫都有某種DAO層。 通常,實現范圍從沒有抽象基類的多個…

強肝保肝養肝4大食物

“強肝的食物,保肝的食物有哪些,養肝的食物有哪些”如果您對這些食物不了解不明白。那就看看專家為您推薦的四款強肝保肝養肝的食物。荔枝(供圖/華蓋)一、是荔枝,荔枝可以保肝,對肝有好處根據《本草綱目》記載荔枝有強肝健胰的效果…

如何查看注解實現_該怎么運用注解呢?Java團隊元老有話說

來源 | 異步 15講能學好誕生24年的JAVA嗎?你當然會感到懷疑,眾所周知,在技術向的IT論壇上,“如何在十天之內快速掌握好Java?”這類問題,往往會招來嘲笑。來源于知乎但在當下,5分鐘能看完一部電影…

NXP S32K144開發(一)環境搭建和新建工程

1、首先需要安裝S32 Design Studio for ARM,在NXP官網可以搜索到,這玩意也是基于eclipse的 安裝好后就可以打開了。 2、新建工程 過程可以參考NXP官網: https://www.nxp.com/document/guide/get-started-with-the-s32k144evb:NGS-S32K144E…