iOS编程(4)上传文件和字符串

本文介绍了如何在iOS中同时使用POST方法上传图片和NSString。通过参考ios Upload Image and Text using HTTP POST,详细讲解了实现过程,并提供了UIImage到NSData的压缩函数代码,确保图片不超过指定大小。

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

一、介绍

用POST上传NSString或者图片都比较简单,但是一起上传的时候就有点难度,这里说一下图片和字符串怎么一起POST

二、实现

参考ios Upload Image and Text using HTTP POST
附上代码&解释
//一共传递3个变量,其中nickname和sex是NSString的对象而photoFile是UIImage
//设置好url后初始化request,接下来需要做的有这几件事情:1.设置multipart&boundary,2.nickname、sex&photoFile加入到NSMutableData类型的body变量中,其中每个变量之间要设置分界线,3.将设置好的body作为request的HTTPbody,然后用NSURLSessionDataTask来发送即可
//注意:1、[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];这里的--不能少,不然会失败
//2、\r\n用于换行
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
NSString *boundary = @"----WebKitFormBoundary7MA4YWxkTrZu0gW";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSMutableData *body = [NSMutableData data];
//nickname
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=%@\r\n\r\n",@"nickname"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[self.writeName.text stringByAppendingString:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
//sex
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",@"sex"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"1\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//photo file
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"headPhoto.jpg\"\r\n", @"photoFile"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:imageData];
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

//set http body
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:body];

三、微小的工作

上传图片的时候应该保证图片不超过指定大小,这里在将UIImage转成NSData的时候,用到了UIImageJPEGRepresentation函数的压缩系数,用loop的方法保证NSData的大小,附上压缩函数代码
- (NSData *)compressImage:(UIImage *)image {
    CGFloat compression = 0.9f;
    CGFloat maxCompression = 0.1f;
    int maxFileSize = 2048000;

    NSData *imageData = UIImageJPEGRepresentation(self.chooseHeadPhoto.imageView.image, compression);

    while ([imageData length] > maxFileSize && compression > maxCompression)
    {
        compression -= 0.1;
        imageData = UIImageJPEGRepresentation(self.chooseHeadPhoto.imageView.image, compression);
    }
    return imageData;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值