通过post请求上传文件(图片为例)

本文详细介绍了如何使用 iOS 应用通过 POST 请求上传 JPEG 图片到服务器的方法。从设置请求头到构造请求体,再到使用 URLSession 发送上传任务,文章提供了完整的代码实现,并附带了处理响应数据的方式。

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


post请求上传数据的时候,总是记不住拼接方法,记录如下:

#define boundary @"AaB03x" //设置边界 参数可以随便设置
#define fileParam @"file"
- (void)uploadImage:(UIImage *)image
{
    NSString *urlStr = @"";
    NSURL *url=[NSURL URLWithString:urlStr];
    
    //2.创建request请求
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
    //(1)请求模式(默认是GET)
    [request setHTTPMethod:@"POST"];
    //(2)超时时间
    //[request setTimeoutInterval:120];
    //(3)缓存策略
    //[request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];
    
    //(4)请求头
    //以下代码是关键
    //upload task不会在请求头里添加content-type(上传数据类型)字段
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data;charset=utf-8;boundary=%@", boundary];
    [request setValue:contentType forHTTPHeaderField:@"Content-Type"];
    
    //(5)设置请求体
    
    //本地图片
    NSData *bodyData=UIImageJPEGRepresentation(image, 0.1);
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // 设置时间格式(主要是为了命名文件)
    formatter.dateFormat = @"yyyyMMddHHmmss";
    NSString *str = [formatter stringFromDate:[NSDate date]];
    NSString *fileName = [NSString stringWithFormat:@"%@.jpeg", str];
    NSMutableData *body = [NSMutableData data];
    
    //(注意上面宏定义的请求体边界下面就要用上了)
    //如果需要同时上传多个文件,用这段代码循环拼接所有bodyData
    if (bodyData) {
        [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", fileParam, fileName] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:bodyData];
    }
    //加上尾部,如果需要同时上传多个文件,循环拼接所有bodyData后再加上尾部
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    //3.创建网络会话
    NSURLSession *session=[NSURLSession sharedSession];
    //4.创建网络上传任务
    NSURLSessionUploadTask *dataTask=[session uploadTaskWithRequest:request fromData:body completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (data) {
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; NSLog(@"dadada===%@",dict);
            //处理返回值
        }
        if (error) {
            //处理错误
        };
    }];
    //5.发送网络任务
    [dataTask resume];
}
 


除了图片以外,其他类型文件也可以按照此方法上传,但是需要注意文件名的后缀。

参考:http://blog.youkuaiyun.com/yang__xz/article/details/50924017

           http://www.2cto.com/kf/201503/385899.html

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值