iOS 上傳單個(gè)文件

上傳文件Http請(qǐng)求格式

POST /php/upload/upload.php HTTP/1.1
Host: 127.0.0.1
Content-Type: multipart/form-data; boundary=標(biāo)識(shí)(可自定義)
// 請(qǐng)求體
--標(biāo)識(shí)(可自定義,但必須與請(qǐng)求頭中一致)
Content-Disposition: form-data; name="userfile"; filename="head1.png"
Content-Type: image/png
空行
文件的二進(jìn)制數(shù)據(jù)
--標(biāo)識(shí)(可自定義,但必須與請(qǐng)求頭中一致)--
#define kBOUNDARY @"abc"
- (void)viewDidLoad {
    [super viewDidLoad];

    [self uploadFile:@"http://127.0.0.1/php/upload/upload.php" filePath:@"head1.png" fieldName:@"userfile"];
}

// 上傳單個(gè)文件
- (void)uploadFile:(NSString *)netUrl filePath:(NSString *)filePath fieldName:(NSString *)fieldName{
    NSURL *url = [NSURL URLWithString:netUrl];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"post";
    // Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryhT0AfwNoY4DpooRu
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", kBOUNDARY] forHTTPHeaderField:@"Content-Type"];
    request.HTTPBody = [self body:filePath fieldName: fieldName];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:
     ^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
         if (connectionError) {
             NSLog(@"連接錯(cuò)誤 %@", connectionError);
             return;
         }
         NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
         if (httpResponse.statusCode == 200 || httpResponse.statusCode == 304) {
             // 解析數(shù)據(jù)
             NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
             NSLog(@"%@", dic);
         } else {
             NSLog(@"服務(wù)器內(nèi)部錯(cuò)誤");
         }
     }];
}

- (NSData *)body:(NSString *)filePath fieldName:(NSString *)fieldName{
    NSMutableData *mData = [NSMutableData data];
    
//    ------WebKitFormBoundaryhT0AfwNoY4DpooRu
//    Content-Disposition: form-data; name="userfile"; filename="head1.png"
//    Content-Type: image/png
//    
//    文件的二進(jìn)制數(shù)據(jù)
//    ------WebKitFormBoundaryhT0AfwNoY4DpooRu--
    NSMutableString *mString = [NSMutableString string];
    
    [mString appendFormat:@"--%@\r\n", kBOUNDARY];
    [mString appendFormat:@"Content-Disposition: form-data; name=%@; filename=%@\r\n", fieldName, [filePath lastPathComponent]];
    // 此處Content-Type的值為application/octet-stream時(shí),我們不用去管發(fā)送的文件是什么格式的數(shù)據(jù)
    [mString appendString:@"Content-Type: application/octet-stream\r\n"];
    [mString appendString:@"\r\n"];
    // 拼接文件二進(jìn)制之前的數(shù)據(jù)
    [mData appendData:[mString dataUsingEncoding:NSUTF8StringEncoding]];
    
    NSString *path = [[NSBundle mainBundle] pathForResource:filePath ofType:nil];
    NSData *data = [NSData dataWithContentsOfFile:path];
    
    [mData appendData:data];
    
    NSString *end = [NSString stringWithFormat:@"\r\n--%@--", kBOUNDARY];
    [mData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
    return mData.copy;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,612評(píng)論 19 139
  • iOS網(wǎng)絡(luò)編程讀書(shū)筆記 Facade Tester客戶(hù)端門(mén)面模式的實(shí)例(被動(dòng)版本化) 被動(dòng)版本化,所以硬編碼URL...
    melouverrr閱讀 1,707評(píng)論 3 7
  • apache下的httpclient工具可大大簡(jiǎn)化開(kāi)發(fā)過(guò)程中的點(diǎn)對(duì)點(diǎn)通信,本人將以微信多媒體接口為例,展示http...
    劃破的天空閱讀 5,527評(píng)論 0 32
  • 本文包括:1、文件上傳概述2、利用 Commons-fileupload 組件實(shí)現(xiàn)文件上傳3、核心API——Dis...
    廖少少閱讀 12,744評(píng)論 5 91
  • 使用NSURLConnection上傳文件上傳文件,使用POST還是PUT請(qǐng)求?根據(jù)原來(lái)HTTP的定義使用PUT來(lái)...
    WeiHing閱讀 1,432評(píng)論 1 1

友情鏈接更多精彩內(nèi)容