NSURLSession 做文件上传

本文介绍如何使用NSURLSession进行文件上传操作,包括配置请求头、构造上传数据等步骤,并提供了一个具体的实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 NSURLSession 上传文件和 NSURLConnection 一样需要按格式拼接文件数据.重要的是要学会封装方法,具体使用如下:
    {
        // NSURLSession 做文件上传
        - (void)uploadMfileSession
        {
            // 1.实例化全局网络会话
            NSURLSession *session = [NSURLSession sharedSession];
            
            // 2.创建网络请求
            {
                NSURL *url = [NSURL URLWithString:@"http://localhost/upload/upload-m.php"];
                
                NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
                // 设置请求方法
                request.HTTPMethod = @"POST";
                // 告诉服务器,需要做文件上传
                NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",kBOUNDARY];
                
                [request setValue:contentType forHTTPHeaderField:@"Content-Type"];
            }
            
            // 3. 将需要上传至服务器的文件包装在字典中.
            {
                // 需要上传的文件路径
                NSString *file1 = @"/Users/hushuangfei/Desktop/meinv.jpg";
                NSString *file2 = @"/Users/hushuangfei/Downloads/XMLdemo.xml";
                
                // 文件在服务器中保存的名称
                NSString *fileName1 = @"meinv";
                NSString *fileName2 = @"demo";
                
                // 将上传数据包装在字典中
                NSMutableDictionary *fileDict = [NSMutableDictionary dictionary];

                [fileDict setObject:file1 forKey:fileName1];
                [fileDict setObject:file2 forKey:fileName2];
            }
            // 4. 将需要上传的非文件数据也包装在字典中
            {
                NSMutableDictionary *parameter = [NSMutableDictionary dictionary];
                [parameter setObject:@"hushuangfei" forKey:@"username"];
            }
            // 5. 将需要上传的数据,按照上传的数据格式化数据.并且转为二进制数据.
            NSData *dataM = [self formDataWithfileName:@"userfile[]" fileDict:fileDict parameter:parameter];
            
            // 6. 利用网络会话,建立上传任务
            NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:dataM completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                //
                NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
                
                NSLog(@"response: %@",response);
                
            }];
            
            // 7 .开始上传.
            [task resume];
        }
        
        // 格式化上传数据的方法封装.
        - (NSData *) formDataWithfileName:(NSString *)fileName fileDict:(NSDictionary *)fileDict parameter:(NSDictionary *)parameter
        {
            
            NSMutableData *data = [NSMutableData data];
            
            // key : 服务器保存的文件名
            // obj : 上传的文件地址
            [fileDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
                //
                NSMutableString *headerStrM = [NSMutableString stringWithFormat:@"\r\n--%@\r\n",kBOUNDARY];
                [headerStrM appendFormat:@"Content-Disposition: form-data; name=%@; filename=%@\r\n",fileName,key];
                
                NSString *contentType = [self getContentTypeFromFile:obj];
                
                [headerStrM appendFormat:@"Content-Type: %@\r\n\r\n",contentType];
                
                NSData *headerData = [headerStrM dataUsingEncoding:NSUTF8StringEncoding];
                
                NSData *fileData = [NSData dataWithContentsOfFile:obj];
                
                
                [data appendData:headerData];
                [data appendData:fileData];
                
            }];
            
            // key :username 服务器接收的 key
            // obj :上传文件的人
            [parameter enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
                //
                NSMutableString *headerM = [NSMutableString stringWithFormat:@"\r\n--%@\r\n",kBOUNDARY];
                [headerM appendFormat:@"Content-Disposition: form-data; name=%@\r\n\r\n",key];
                
                NSString *username = obj;
                
                NSData *headerData = [headerM dataUsingEncoding:NSUTF8StringEncoding];
                
                NSData *userData = [username dataUsingEncoding:NSUTF8StringEncoding];
                
                [data appendData:headerData];
                [data appendData:userData];
                
            }];
            
            NSMutableString *footerStrM = [NSMutableString stringWithFormat:@"\r\n--%@--\r\n",kBOUNDARY];
            
            NSData *footerData = [footerStrM dataUsingEncoding:NSUTF8StringEncoding];
            
            [data appendData:footerData];
            
            return data;
        }
    }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值