日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

post上传代码实现

發布時間:2025/3/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 post上传代码实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  post傳遞普通賬號密碼時候,數據包含在請求體中。在上傳文件的時候同樣如此。當一個服務器接收到上傳指令。假設發送一個簡單的txt,此時客戶端整體發送給服務器的數據包含兩大類:

  兩者加起來就是完整的發送給服務器的二級制數據的組成格式。由于W3C制定了標準格式,并且apple沒有封裝。所有如果在IOS中,實現POST上傳文件,需要拼接數據成上述格式才能實現(java? .net都封裝了...)。

  但是IOS有第三方框架。AFN能夠實現同時上傳一個文件,有時候的格式還無法上傳。ASI能實現多個上傳(MRC--2012停止更新--設計的目標平臺是IOS2.0/3.0)。

番外篇:

  在以前的服務器中,服務器價格往往昂貴。網站基本會限制上傳或者批量上傳。例如照片不能超多多少M,只能單張傳遞(年輕的QQ控件)。隨著現今云服務器的普及,軟件開發商希望獲得更多的用戶數據,所以上傳下載批量實現在移動互聯端也很重要。

  此時 出現了一種交 UGC(用戶生成內容)的應用。(網易新聞,糗事百科,微博等等等)---想要把軟件做好,就要鼓勵用戶生成內容。(這就是評論,彈幕的魅力),官方軟件總有力竭的一天。而用戶是無窮的。各類微博基本都是靠名人效應吸引大家,然后數據大部分來自用戶。

  垂直社交軟件:三大移動巨頭的用戶是很多很多的。而這個世界上的用戶是無窮的。垂直社交app現在也是很高大上。騎行,羽毛球,爬山,窮游,酒吧。一群人的圈子不會僅限于微信貼吧。有專屬的權威的APP,大家肯定更喜歡用。

?

繼續POST: 

  如上content-Type為Xcode實現上傳必須拼接的數據,兩個加起來就是一個完整的二進制數據。

  盜用刀哥一段總結,已經超越了我網絡工程的憂郁專門門檻

1 Content-Type: multipart/form-data; boundary(分隔線)=(可以隨便寫,ASCII,字母和數字) 2 3 ## 注釋 4 5 * userfile => 負責上傳文件腳本中的 字段名,開發的時候,可以咨詢后端程序員 6 * filename => 將文件保存在服務器上的文件名稱 7 * Content-Type: 客戶端告訴服務器上傳文件的文件類型 8 - 大類型/小類型 9 - text/plain 10 - image/jpg 11 - image/png 12 - image/gif 13 - text/html 14 - application/json 15 16 - application/octet-stream(8進制流),如果不想告訴服務器具體的文件類型,可以使用這個 Content-Type 17 18 * 注意:每一行末尾需要有一定的 \r\n 19 * 提示:有些服務器可以直接使用 \n,但是新浪微博如果使用 \n 上傳文件,服務器會返回“沒有權限”的錯誤! 20 21 ## 上傳單個文件 22 23 --boundary\r\n 24 Content-Disposition: form-data; name="userfile"; filename="aaa.txt"\r\n 25 Content-Type: application/octet-stream\r\n\r\n 26 27 要上傳文件的二進制數據 28 29 \r\n--boundary-- 30 31 32 ## 上傳多個文件 33 34 * 有些服務器可以在上傳文件的同時,提交一些文本內容給服務器 35 * 典型應用:新浪微博,上傳圖片的同時,發送一個微博! 36 37 38 Content-Type: multipart/form-data; boundary=boundary 39 40 // ------ 以下內容,是提價給服務器的二進制數據格式 41 --boundary\r\n 42 Content-Disposition: form-data; name="userfile[]"; filename="aaa.txt"\r\n 43 Content-Type: application/octet-stream\r\n\r\n 44 45 二進制數據 46 \r\n 47 --boundary\r\n 48 Content-Disposition: form-data; name="userfile[]"; filename="aaa副本.txt"\r\n 49 Content-Type: application/octet-stream\r\n\r\n 50 51 二進制數據 52 \r\n 53 --boundary\r\n 54 // status 是腳本文件接收參數的名稱 55 Content-Disposition: form-data; name="status"\r\n\r\n 56 57 二進制數據 58 \r\n 59 --boundary-- 60 // ------

?

OC實現:

  (1)三步完成請求發送

  (2)單獨封裝請求體拼接方法

  (3)觸摸調動方法

?

1 static NSString *boundary = @"aixiaoxin"; 2 3 - (void)upLoad:(NSString *)field fileName:(NSString *)fileName data:(NSData *)data{ 4 5 // 發送請求 6 NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/post/upload.php"]; 7 8 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:10.0]; 9 10 // 設置請求類型 11 request.HTTPMethod = @"POST"; 12 13 // 設置請求體 14 // field是后臺要的一個數據(html中依據這個接收) 15 // fileName是要保存的文件名 16 // data就是你要上傳的文件的二進制形式 17 request.HTTPBody = [self httpBody:field fileName:fileName data:data]; 18 19 // POST上傳此時還要多一個content-type類型,用kvc 20 //Content-Type: multipart/form-data; boundary(分隔線)=(可以隨便寫,ASCII,字母和數字) 21 [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"]; 22 23 // Connection異步主隊列發送請求 24 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 25 // 這是一個json 26 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; 27 NSLog(@"%@",dic); 28 }]; 29 30 31 32 }

?

1 - (NSData *)httpBody:(NSString *)field fileName:(NSString *)fileName data:(NSData *)data{ 2 3 NSMutableData *dataM = [NSMutableData data]; 4 5 //按照W3C規定的發送給服務器的格式拼接數據 6 /* 7 --boundary\r\n 8 Content-Disposition: form-data; name="userfile"; filename="aaa.txt"\r\n 9 Content-Type: application/octet-stream\r\n\r\n 10 11 要上傳文件的二進制數據 12 13 \r\n--boundary-- 14 15 */ 16 17 NSMutableString *strM = [NSMutableString stringWithFormat:@"--%@\r\n", boundary]; 18 [strM appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", field, fileName]; 19 [strM appendString:@"Content-Type: application/octet-stream\r\n\r\n"]; 20 21 [dataM appendData:[strM dataUsingEncoding:NSUTF8StringEncoding]]; 22 [dataM appendData:data]; 23 24 NSString *tail = [NSString stringWithFormat:@"\r\n--%@--", boundary]; 25 [dataM appendData:[tail dataUsingEncoding:NSUTF8StringEncoding]]; 26 27 return [dataM copy]; 28 29 30 } 1 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 2 3 // 測試要上傳到服務器的圖片轉化成二進制 4 NSString *imgStr = [[NSBundle mainBundle]pathForResource:@"1.jpg" ofType:nil]; 5 NSData *imgData = [NSData dataWithContentsOfFile:imgStr]; 6 7 // 調用方法 8 [self upLoad:@"userfile" fileName:@"我是上傳的文件.png" data:imgData]; 9 10 }

?

  完成后可看到結論代碼:

?

  分析:error = 0說明上傳成功

     name沒有轉碼,因為設定是中文,但是是.png可以看出確實是一個圖片

     size大小12260

     tmp_name貌似每次名字都不一樣,應該是在沙盒中?--不太清楚

     type是類型,application/octet-stream說明不需要讓服務器知道上傳的是什么類型,或者imgae/png來上傳png圖片也可以

  此時在服務器中就可以看到了

轉載于:https://www.cnblogs.com/aixiaoxin/p/4665053.html

總結

以上是生活随笔為你收集整理的post上传代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。