iOS开发-文件上传

NSURLSessionUploadTask 上传文件

1.创建NSURLSessionUploadTask和NSURLSession

-(void)upload
{

    NSURL *url = [NSURL URLWithString:@"上传路径"];
    
    //创建"可变"请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    //设置请求方法
    request.HTTPMethod = @"POST";
    
    //+ "设置请求头信息,告诉服务器这是一个文件上传请求"
    //Content-Type:multipart/form-data; boundary=--分隔符(不能是中文,并且分隔符要一致)
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",分隔符] forHTTPHeaderField:@"Content-Type"];
    
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
    //+ "按照固定的格式来拼接数据"
   //设置请求体信息(文件参数) 
   NSData *data = [self bodyData];
    NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData: data completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

    }];
    
    //执行上传文件
    [uploadTask resume];
    
}

2.拼接请求体信息

-(NSData *)bodyData
{
    NSMutableData *data = [NSMutableData data];
    NSData *knewLine =  [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding];
    //01 拼接文件参数
    /*
    --分隔符
    Content-Disposition: form-data; name="file"; filename="文件名称"
    Content-Type: image/png
    空行
    文件数据
     */
    [data appendData:[[NSString stringWithFormat:@"--%@",分隔符] dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData: knewLine];
    //name:file 服务器规定
    //filename:该文件上传到服务器之后的名称
    //username|pwd
    [data appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"文件名称\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData: knewLine];
    //要上传文件的二进制数据类型  MIMEType 组成:大类型/小类型
    [data appendData:[@"Content-Type: image/png" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData: knewLine];
    [data appendData: knewLine];
    NSData *imageData = [NSData dataWithContentsOfFile:@"上传的文件路径"];
    [data appendData:imageData];
    [data appendData: knewLine];
    
    //02 拼接非文件参数
    /*
     --分隔符
     Content-Disposition: form-data; name="username"
     空行
     abcdf
     */
    [data appendData:[[NSString stringWithFormat:@"--%@",分隔符] dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData: knewLine];
    //name:username
    [data appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData: knewLine];
    [data appendData: knewLine];
    [data appendData:[@"abcdef" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData: knewLine];
    
    //03 结尾标识
    /*
     --分隔符--
     */
     [data appendData:[[NSString stringWithFormat:@"--%@--",分隔符] dataUsingEncoding:NSUTF8StringEncoding]];
    
    return data;
}

3.NSURLSessionDataDelegate

// 监听上传进度
//bytesSent 本次上传文件的数据大小
//totalBytesSent 已经上传文件的总大小
//totalBytesExpectedToSend 文件的总大小
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
{
    NSLog(@"%f",1.0 * totalBytesSent / totalBytesExpectedToSend);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容