post 上傳文件(不用框架: 未完)

前言叨逼叨

  • iOS上傳文件篷扩,可能有很多第三方的框架之類的,比如AFN或者Alamofire之類的框架,但是今天要談?wù)摰氖窃腁PI是如何進行文件上傳曹阔。

兵馬未動糧草先行

  • 首先明確幾點半开,上傳是用post實現(xiàn)的,另外服務(wù)器要提供好上傳的接口
  • 上傳的類型包括單個文件赃份,多個文件寂拆,或者JSON或者自定義對象等等
  • 總思路:
    • 手動拼接請求頭
    • 將要上傳的內(nèi)容轉(zhuǎn)換為二進制數(shù)據(jù),并將其拼接到請求體中

一些必要的參數(shù)

  • application/x-www-form-urlencoded
    • 主要向服務(wù)器提交用戶隱私相關(guān)的信息
    • 瀏覽器支持
  • multipart/form-data
    • 向服務(wù)器上傳小文件
    • 瀏覽器支持
  • application/json
    • 向后臺服務(wù)器提交結(jié)構(gòu)化數(shù)據(jù)
    • RESTful 設(shè)計風格需要
  • text/xml
    • 向后臺服務(wù)器提交結(jié)構(gòu)化數(shù)據(jù)
    • RESTful 設(shè)計風格需要

具體實現(xiàn)

上傳單個文件

  • 請求格式
Content-Type: multipart/form-data; boundary(分隔線)=(可以隨便寫芥炭,ASCII漓库,字母和數(shù)字)
  • 數(shù)據(jù)格式
--boundary\r\n
Content-Disposition: form-data; name="userfile"; filename="aaa.txt"\r\n
Content-Type: application/octet-stream\r\n\r\n

要上傳文件的二進制數(shù)據(jù)

\r\n--boundary--
  • 說明

    • userfile:負責上傳文件腳本中的 字段名,開發(fā)的時候园蝠,可以咨詢后端程序員

    • filename:將文件保存在服務(wù)器上的文件名稱

    • Content-Type:客戶端告訴服務(wù)器上傳文件的文件類型

      • text/plain
      • image/jpg
      • image/png
      • image/gif
      • text/html
      • application/json
      • application/octet-stream(8進制流)渺蒿,如果不想告訴服務(wù)器具體的文件類型,可以使用這個 Content-Type
    • 注意:每一行末尾需要有一定的 \r\n

    • 提示:有些服務(wù)器可以直接使用 \n彪薛,但是新浪微博如果使用 \n 上傳文件茂装,服務(wù)器會返回“沒有權(quán)限”的錯誤!

代碼實現(xiàn)

生成 formData 二進制數(shù)據(jù)

#define boundary    @"itheima-upload"

///  生成 formData 二進制數(shù)據(jù)
///
///  @param fieldName 服務(wù)器字段名
///  @param fileName  文件名
///  @param fileData  上傳文件二進制數(shù)據(jù)
///
///  @return formData 二進制數(shù)據(jù)
- (NSData *)formData:(NSString *)fieldName fileName:(NSString *)fileName fileData:(NSData *)fileData {

    NSMutableData *dataM = [NSMutableData data];

    // 拼接數(shù)據(jù)
    NSMutableString *strM = [NSMutableString string];

    [strM appendFormat:@"--%@\r\n", boundary];
    [strM appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", fieldName, fileName];
    [strM appendString:@"Content-Type: application/octet-stream\r\n\r\n"];

    [dataM appendData:[strM dataUsingEncoding:NSUTF8StringEncoding]];
    [dataM appendData:fileData];

    NSString *tail = [NSString stringWithFormat:@"\r\n--%@--", boundary];
    [dataM appendData:[tail dataUsingEncoding:NSUTF8StringEncoding]];

    return dataM.copy;
}

上傳單個文件

///  上傳單個文件
///
///  @param fieldName 服務(wù)器自短命
///  @param fileName  文件名
///  @param fileData  上傳文件二進制數(shù)據(jù)
- (void)uploadFile:(NSString *)fieldName fileName:(NSString *)fileName fileData:(NSData *)fileData {
    // 1. url - 負責上傳的腳本
    NSURL *url = [NSURL URLWithString:@"http://localhost/post/upload.php"];

    // 2. request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"POST";

    NSString *typeValue = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    [request setValue:typeValue forHTTPHeaderField:@"Content-Type"];

    request.HTTPBody = [self formData:fieldName fileName:fileName fileData:fileData];

    // 3. connection
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]);
    }];
}

測試代碼

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"001.png" withExtension:nil];
    NSData *data = [NSData dataWithContentsOfURL:fileURL];

    [self uploadFile:@"userfile" fileName:@"abc" fileData:data];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末善延,一起剝皮案震驚了整個濱河市少态,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌易遣,老刑警劉巖彼妻,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異豆茫,居然都是意外死亡侨歉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門揩魂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幽邓,“玉大人,你說我怎么就攤上這事火脉∏6妫” “怎么了柒啤?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長畸颅。 經(jīng)常有香客問我担巩,道長,這世上最難降的妖魔是什么重斑? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任兵睛,我火速辦了婚禮,結(jié)果婚禮上窥浪,老公的妹妹穿的比我還像新娘。我一直安慰自己笛丙,他們只是感情好漾脂,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胚鸯,像睡著了一般骨稿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姜钳,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天坦冠,我揣著相機與錄音,去河邊找鬼哥桥。 笑死辙浑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的拟糕。 我是一名探鬼主播判呕,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼送滞!你這毒婦竟也來了侠草?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤犁嗅,失蹤者是張志新(化名)和其女友劉穎边涕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褂微,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡功蜓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蕊梧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霞赫。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肥矢,靈堂內(nèi)的尸體忽然破棺而出端衰,到底是詐尸還是另有隱情叠洗,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布旅东,位于F島的核電站灭抑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抵代。R本人自食惡果不足惜腾节,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荤牍。 院中可真熱鬧案腺,春花似錦、人聲如沸康吵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晦嵌。三九已至同辣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惭载,已是汗流浹背旱函。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留描滔,地道東北人棒妨。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像伴挚,于是被迫代替她去往敵國和親靶衍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容