POST 上传文件

本文介绍了一种在iOS应用中使用Objective-C实现文件及表单数据上传的方法。通过具体的代码示例,展示了如何构建HTTP POST请求,设置必要的请求头,并发送带有文件和表单字段的multipart/form-data类型的请求。

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

http://bbs.yusian.com/thread-8181-1-1.html



- (void)upload
{
    NSString *urlStr = @"http://localhost/upload.php";
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr] cachePolicy:0 timeoutInterval:5.0f];
     
    [self setRequest:request];
     
    NSLog(@"开始上传...");
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
         
        NSLog(@"Result--%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
         
    }];
}
 
- (void)setRequest:(NSMutableURLRequest *)request
{
    NSString *boundary = [NSString stringWithFormat:@"Boundary+%08X%08X", arc4random(), arc4random()];
    NSMutableData *body = [NSMutableData data];
     
    // 表单数据
    NSMutableDictionary *param = [[NSMutableDictionary alloc] init];
    [param setValue:@"254" forKey:@"empId"];
    [param setValue:@"18718" forKey:@"shopId"];
     
    /** 遍历字典将字典中的键值对转换成请求格式:
     --Boundary+72D4CD655314C423
     Content-Disposition: form-data; name="empId"
      
     254
     --Boundary+72D4CD655314C423
     Content-Disposition: form-data; name="shopId"
      
     18718
     */
    [param enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSMutableString *fieldStr = [NSMutableString string];
        [fieldStr appendString:[NSString stringWithFormat:@"--%@\r\n", boundary]];
        [fieldStr appendString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key]];
        [fieldStr appendString:[NSString stringWithFormat:@"%@", obj]];
        [body appendData:[fieldStr dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    }];
     
     
    /// 图片数据部分
    NSMutableString *topStr = [NSMutableString string];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"001.jpg" ofType:nil];
    NSData *data = [NSData dataWithContentsOfFile:path];
     
    /**拼装成格式:
     --Boundary+72D4CD655314C423
     Content-Disposition: form-data; name="uploadFile"; filename="001.png"
     Content-Type:image/png
     Content-Transfer-Encoding: binary
      
     ... contents of boris.png ...
     */
    [topStr appendString:[NSString stringWithFormat:@"--%@\r\n", boundary]];
    [topStr appendString:@"Content-Disposition: form-data; name=\"uploadFile\"; filename=\"001.png\"\r\n"];
    [topStr appendString:@"Content-Type:image/png\r\n"];
    [topStr appendString:@"Content-Transfer-Encoding: binary\r\n\r\n"];
    [body appendData:[topStr dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:data];
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
     
    // 结束部分
    NSString *bottomStr = [NSString stringWithFormat:@"--%@--", boundary];
    /**拼装成格式:
     --Boundary+72D4CD655314C423--
     */
    [body appendData:[bottomStr dataUsingEncoding:NSUTF8StringEncoding]];
     
    // 设置请求类型为post请求
    request.HTTPMethod = @"post";
    // 设置request的请求体
    request.HTTPBody = body;
    // 设置头部数据,标明上传数据总大小,用于服务器接收校验
    [request setValue:[NSString stringWithFormat:@"%d", body.length] forHTTPHeaderField:@"Content-Length"];
    // 设置头部数据,指定了http post请求的编码方式为multipart/form-data(上传文件必须用这个)。
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值