原始的方式實現文件上傳 & AFNetworking文件上傳

原始方式文件上傳的步驟:
     1、創建POST請求
      NSURL *url = [NSURL URLWithString:@"文件上傳到服務器的Url"];
      NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
      request.HTTPMethod = @"POST";
    2、設置請求頭(告訴告訴服務器,這是一個文件上傳的請求)
        ①非文件參數(普通的用戶名賬戶和密碼等參數)
        --本次文件上傳的標識字符串\r\n
        Content-Disposition: form-data; name="參數名"\r\n
        \r\n
        參數值
         \r\n
        ②文件參數(上傳文件的二進制數據、若上傳多個文件時,多次使用該格式)
        --本次文件上傳的標識字符串\r\n
         Content-Disposition: form-data; name="參數名"; filename="文件名"\r\n
         Content-Type: 文件的MIMEType\r\n
         \r\n
         文件數據
         \r\n

        ③添加結束標記,必須遵守格式
        --本次文件上傳的標識字符串--\r\n

示例程序:
#define XMGBoundary @"520it"
#define XMGEncode(string) [string dataUsingEncoding:NSUTF8StringEncoding]
#define XMGNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 創建請求
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"POST";
    
    // 設置請求頭(告訴告訴服務器,這是一個文件上傳的請求)
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", XMGBoundary] forHTTPHeaderField:@"Content-Type"];
    
    // 設置請求體
    NSMutableData *body = [NSMutableData data];
    
    // 文件參數
    /*
     --分割線\r\n
     Content-Disposition: form-data; name="參數名"; filename="文件名"\r\n
     Content-Type: 文件的MIMEType\r\n
     \r\n
     文件數據
     \r\n
     */
    // 分割線
    [body appendData:XMGEncode(@"--")];
    [body appendData:XMGEncode(XMGBoundary)];
    [body appendData:XMGNewLine];
    
    // 文件參數名
    [body appendData:XMGEncode([NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"test.png\""])];
    [body appendData:XMGNewLine];
    
    // 文件的類型
    [body appendData:XMGEncode([NSString stringWithFormat:@"Content-Type: image/png"])];
    [body appendData:XMGNewLine];
    
    // 文件數據
    [body appendData:XMGNewLine];
//    UIImageJPEGRepresentation(<#UIImage *image#>, <#CGFloat compressionQuality#>)
    UIImage *image = [UIImage imageNamed:@"placeholder"];
    [body appendData:UIImagePNGRepresentation(image)];
//    [body appendData:[NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/test.png"]];
    [body appendData:XMGNewLine];
    
    // 非文件參數
    /*
     --分割線\r\n
     Content-Disposition: form-data; name="參數名"\r\n
     \r\n
     參數值
     \r\n
     */
    // 分割線
    [body appendData:XMGEncode(@"--")];
    [body appendData:XMGEncode(XMGBoundary)];
    [body appendData:XMGNewLine];
    
    // 參數名
    [body appendData:XMGEncode([NSString stringWithFormat:@"Content-Disposition: form-data; name=\"username\""])];
    [body appendData:XMGNewLine];
    
    // 參數值
    [body appendData:XMGNewLine];
    [body appendData:XMGEncode(@"jack")];
    [body appendData:XMGNewLine];
    
    // 結束標記
    /*
     --分割線--\r\n
     */
    [body appendData:XMGEncode(@"--")];
    [body appendData:XMGEncode(XMGBoundary)];
    [body appendData:XMGEncode(@"--")];
    [body appendData:XMGNewLine];
    
    request.HTTPBody = body;
    
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }];
}

@end
    2、使用AFN提供的POST方法最便捷
    ①上傳單個文件
    AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
    
    [mgr POST:@"http://120.25.226.186:32812/upload" parameters:@{@"username" : @"123"}
        constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        // 在這個block中設置需要上傳的文件
//            NSData *data = [NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/placeholder.png"];
//            [formData appendPartWithFileData:data name:@"file" fileName:@"test.png" mimeType:@"image/png"];
            
//            [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/placeholder.png"] name:@"file" fileName:@"xxx.png" mimeType:@"image/png" error:nil];
    
            [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/placeholder.png"] name:@"file" error:nil];
    } success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"-------%@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        
    }];
   ②上傳多個文件文件
AFHTTPSessionManager *sharedManager1 = [[AFHTTPSessionManager alloc]init];
sharedManager1.requestSerializer = [AFHTTPRequestSerializer serializer];
sharedManager1.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/plain",nil];
sharedManager1.requestSerializer.timeoutInterval =20;
[sharedManager1.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[sharedManager1.requestSerializer setValue:@"text/html; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    NSDictionary *dic = @{@"param.token":_token};
[sharedManager1 POST:kUploadFile parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        for (int i = 0; i < fileUpload.count; i ++) {
                NSData *data = UIImageJPEGRepresentation(fileUpload[i], 0.3);
                NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
                // 設置時間格式
                formatter.dateFormat = @"yyyyMMddHHmmss";
                NSString *str = [formatter stringFromDate:[NSDate date]];
                NSString *fileName = [NSString stringWithFormat:@"%@-%@.jpeg", str,[NSString stringWithFormat:@"%d",i]];
                [formData appendPartWithFileData:data name:@"fileUpload" fileName:fileName mimeType:@"image/jpeg"];     
        }
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        success(task,responseObject);
    } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
        fail(task,error);
    }];
3、NSURLSessionConfiguration實現文件上傳
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/upload"]];
    request.HTTPMethod = @"POST";
    
    // 設置請求頭(告訴服務器,這是一個文件上傳的請求)
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", XMGBoundary] forHTTPHeaderField:@"Content-Type"];
    
    // 設置請求體
    NSMutableData *body = [NSMutableData data];
    
    // 文件參數
    // 分割線
    [body appendData:XMGEncode(@"--")];
    [body appendData:XMGEncode(XMGBoundary)];
    [body appendData:XMGNewLine];
    
    // 文件參數名
    [body appendData:XMGEncode([NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"test.png\""])];
    [body appendData:XMGNewLine];
    
    // 文件的類型
    [body appendData:XMGEncode([NSString stringWithFormat:@"Content-Type: image/png"])];
    [body appendData:XMGNewLine];
    
    // 文件數據
    [body appendData:XMGNewLine];
    [body appendData:[NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/test.png"]];
    [body appendData:XMGNewLine];
    
    // 結束標記
    /*
     --分割線--\r\n
     */
    [body appendData:XMGEncode(@"--")];
    [body appendData:XMGEncode(XMGBoundary)];
    [body appendData:XMGEncode(@"--")];
    [body appendData:XMGNewLine];
    
    [[self.session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSLog(@"-------%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }] resume];
    4、使用AFN的uploadTaskWithRequest方法需要類似NSURLSessionConfiguration、原始上傳數據 拼接請求體比較麻煩

      AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
    NSURLRequest *request = [NSURLRequest requestWithURL:@""];
    NSMutableData *body = [NSMutableData data];

    [mgr uploadTaskWithRequest:request fromData:body progress:<#(NSProgress *__autoreleasing *)#> completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        NSLog(@"-------%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }];

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容