NSURLSession的文件上传

文件上传的步骤:

(1)确定上传路径

(2)创建“可变”请求对象

(3)修改请求方法为POST

    --设置请求头信息,告诉服务器这是一个文件上传请求

    --按照固定的格式拼接数据

(4)设置请求体信息(文件参数)

(5)创建会话对象

(6)根据会话对象来创建uploadTask

(7)执行task发送请求上传文件

 

代码示例如下:

需要注意的是:拼接的数据是必须按照格式拼接,否则会报错。

#import "ViewController.h"

#define kBoundary @"----WebKitFormBoundaryXGAyMbuVkeaFc916"
#define kNewLine  [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]
@interface ViewController ()

@end

@implementation ViewController


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // (1)确定上传路径
    NSURL *url = [NSURL URLWithString:@"http://mbs.test.internet.zhiwangyilian.com/api/files/upload"];
    //(2)创建“可变”请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //(3)修改请求方法为POST
    request.HTTPMethod = @"POST";
    // --设置请求头信息,告诉服务器这是一个文件上传请求
    //Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXGAyMbuVkeaFc916
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", kBoundary] forHTTPHeaderField:@"Content-Type"];
    //--按照固定的格式拼接数据  ----这个放在bodyData中拼接
    //(4)设置请求体信息(文件参数)  ----这个放在bodyData中拼接
    //(5)创建会话对象
    NSURLSession *session = [NSURLSession sharedSession];
    //(6)根据会话对象来创建uploadTask
    /**
     第一个参数:请求对象
     第二个参数:本应该放在请求体中的信息,如果放在请求头中,会被忽略
     */
    NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:[self bodyData] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSLog(@"---%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }];
//(7)执行task发送请求上传文件
    [uploadTask resume];
}

- (NSData *)bodyData {
    NSMutableData *data = [NSMutableData data];
    //01 拼接文件参数
    /**
     --分隔符
     Content-Disposition: form-data; name="file"; filename="22e93acbcced42dbb319a2fc0ecdcec9.jpg"
     Content-Type: image/jpeg
     空行
     文件数据
     --分隔符--
     */
    [data appendData:[[NSString stringWithFormat:@"--%@",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:kNewLine];
    //name=file,其中file是不能随便写的,服务器要求写什么就写什么
    [data appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"22e93acbcced42dbb319a2fc0ecdcec9.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:kNewLine];
    //要上传文件的而进士数据类型,组成:大类型/小类型
    [data appendData:[@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:kNewLine];
    [data appendData:kNewLine];
    NSData *imageData = [NSData dataWithContentsOfFile:@"/Users/gao/Desktop/图片/课程图片/61149b0491243c749fc871e67550a7f6.png"];
    [data appendData:imageData];
    [data appendData:kNewLine];
    
    //02 拼接非文件参数--如果有非文件的数据,就加上这个拼接的格式
    /**
     --分隔符
     Content-Dispositon: form-data; name="useruame"
     空行
     abcdf(输入的内容)
     */
    [data appendData:[[NSString stringWithFormat:@"--%@",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:kNewLine];
    [data appendData:[@"Content-Dispositon: form-data; name=\"useruame\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:kNewLine];
    [data appendData:kNewLine];
    [data appendData:[@"abscdd" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:kNewLine];
    
    //03 结尾表示
    [data appendData:[[NSString stringWithFormat:@"--%@--",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

    return data;
}

@end

 

posted @ 2019-09-29 18:08  一人前行  阅读(889)  评论(0编辑  收藏  举报