iOS 上传多个文件

简介: 上传文件格式POST /php/upload/upload.php HTTP/1.1Host: 127.0.0.1Content-Type: multipart/form-data; boundary=标识(可自定义)请求体--标识(可自定义...

上传文件格式

POST /php/upload/upload.php HTTP/1.1
Host: 127.0.0.1
Content-Type: multipart/form-data; boundary=标识(可自定义)
请求体
--标识(可自定义,但必须与请求头中一致)
Content-Disposition: form-data; name="userfile[]"; filename="head1.png"
Content-Type: image/png
空行
文件二进制数据
--标识(可自定义,但必须与请求头中一致)
Content-Disposition: form-data; name="userfile[]"; filename="head2.png"
Content-Type: image/png
空行
文件二进制数据
--标识(可自定义,但必须与请求头中一致)
Content-Disposition: form-data; name="字段名"

数据值
--标识(可自定义,但必须与请求头中一致)--

多文件文件上传


#define kBOUNDARY @"abc"
- (void)viewDidLoad {
    [super viewDidLoad];
    // 网络链接
    NSString *netUrl = @"http://127.0.0.1/php/upload/upload-m.php";
    
    // 文件路径
    NSString *path1 = [[NSBundle mainBundle] pathForResource:@"head1.png" ofType:nil];
    NSString *path2 = [[NSBundle mainBundle] pathForResource:@"head2.png" ofType:nil];
    NSArray *array = @[path1, path2];
    
    // 字段名
    NSString *fieldName = @"userfile[]";
    // 数据字典
    NSDictionary *dict = @{@"username":@"mazaiting"};
    // 上传文件
    [self uploadFiles:netUrl fieldName:fieldName filePaths:array params:dict];
    
}

// 上传多个文件
// netUrl 网络链接
// fieldName 字段名
// filePaths 文件路径数组
// params 参数字典
- (void)uploadFiles:(NSString *)netUrl fieldName:(NSString *)fieldName filePaths:(NSArray *)filePaths params:(NSDictionary *)params {
    NSURL *url = [NSURL URLWithString:netUrl];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"post";
    // Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryJa8BALfIc9saou2X
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",kBOUNDARY] forHTTPHeaderField:@"Content-Type"];
    request.HTTPBody = [self body:fieldName filePaths:filePaths params:params];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:
     ^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
         if (connectionError) {
             NSLog(@"连接错误 %@", connectionError);
             return;
         }
         NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
         if (httpResponse.statusCode == 200 || httpResponse.statusCode == 304) {
             // 解析数据
             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
             NSLog(@"%@",dict);
         } else {
             NSLog(@"服务器内部错误");
         }
     }];
}

// 构建请求体
- (NSData *)body:(NSString *)fieldName filePaths:(NSArray *)filePaths params:(NSDictionary *)params {
    NSMutableData *mData = [NSMutableData data];
//    ------WebKitFormBoundaryJa8BALfIc9saou2X
//    Content-Disposition: form-data; name="userfile[]"; filename="head1.png"
//    Content-Type: image/png
//    
//    文件二进制数据
//    ------WebKitFormBoundaryJa8BALfIc9saou2X
//    Content-Disposition: form-data; name="userfile[]"; filename="head2.png"
//    Content-Type: image/png
//    
//    文件二进制数据
//    ------WebKitFormBoundaryJa8BALfIc9saou2X
//    Content-Disposition: form-data; name="username"
//    
//    mazaiting
//    ------WebKitFormBoundaryJa8BALfIc9saou2X--
    
    // 构建文件,遍历数组
    [filePaths enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
//              ------WebKitFormBoundaryJa8BALfIc9saou2X
//            Content-Disposition: form-data; name="userfile[]"; filename="head2.png"
//            Content-Type: image/png
//        
//            文件二进制数据
        
        NSMutableString *mString = [NSMutableString string];
        // 判断是否是第一个文件,如果是则不需要添加"\r\n"
        if (idx != 0) {
            [mString appendString:@"\r\n"];
        }
        [mString appendFormat:@"--%@\r\n", kBOUNDARY];
        [mString appendFormat:@"Content-Disposition: form-data; name=%@; filename=%@\r\n", fieldName, [obj lastPathComponent]];
        [mString appendString:@"Content-Type: application/octet-stream\r\n"];
        [mString appendString:@"\r\n"];
        [mData appendData:[mString dataUsingEncoding:NSUTF8StringEncoding]];
        // 拼接文件的二进制数据
        NSData *data = [NSData dataWithContentsOfFile:obj];
        [mData appendData:data];
    }];
    
    // 构建数据
    //    ------WebKitFormBoundaryJa8BALfIc9saou2X
    //    Content-Disposition: form-data; name="username"
    //
    //    mazaiting
    //    ------WebKitFormBoundaryJa8BALfIc9saou2X--
    [params enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        NSMutableString *mString = [NSMutableString string];
        [mString appendFormat:@"\r\n--%@\r\n", kBOUNDARY];
        [mString appendFormat:@"Content-Disposition: form-data; name=%@\r\n", key];
        [mString appendString:@"\r\n"];
        [mString appendFormat:@"%@", obj];
        [mData appendData:[mString dataUsingEncoding:NSUTF8StringEncoding]];
    }];
    
    // 结束语句
    NSString *end = [NSString stringWithFormat:@"\r\n--%@--", kBOUNDARY];
    [mData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];

    return mData.copy;
}
目录
相关文章
|
6月前
|
移动开发 前端开发 数据安全/隐私保护
iOS发布证书.p12文件无密码解决办法及导出带密码的新.p12文件方法
iOS发布证书.p12文件无密码解决办法及导出带密码的新.p12文件方法
196 0
|
存储 网络安全 数据安全/隐私保护
最新版 苹果 IOS AppStore证书申请全流程 包括p12文件
最新版 苹果 IOS AppStore证书申请全流程 包括p12文件
|
6月前
|
Linux 数据安全/隐私保护 iOS开发
如何使用 Xcode 打包导出 IPA 文件并进行 iOS 应用内测,无需支付苹果开发者账号费用?
如何使用 Xcode 打包导出 IPA 文件并进行 iOS 应用内测,无需支付苹果开发者账号费用?
|
6月前
|
Web App开发 Go iOS开发
【IOS】教你如何在手机端轻松安装 ipa 文件 -(安装器已失效 21.10)|社区征文
【IOS】教你如何在手机端轻松安装 ipa 文件 -(安装器已失效 21.10)|社区征文
|
6月前
|
Web App开发 Go iOS开发
【IOS】教你如何在手机端轻松安装 ipa 文件 -(安装器已失效 21.10)
【IOS】教你如何在手机端轻松安装 ipa 文件 -(安装器已失效 21.10)
|
网络安全 开发工具 数据安全/隐私保护
如何把ipa文件(iOS安装包)安装到iPhone手机上? 附方法汇总
如何把ipa文件(iOS安装包)安装到iPhone手机上? 附方法汇总
|
移动开发 前端开发 数据安全/隐私保护
iOS发布证书.p12文件无密码解决办法及导出带密码的新.p12文件方法
本文将以iOS技术博主身份,分享解决使用无密码的.p12文件发布应用时遇到的问题,并介绍如何以带密码的方式重新导出.p12文件的方法。通过本文提供的步骤,开发者可以顺利完成证书的发布流程。
|
6月前
|
iOS开发 开发者
【教程】uni-app iOS 打包解决 profile 文件与私钥证书不匹配问题
【教程】uni-app iOS 打包解决 profile 文件与私钥证书不匹配问题
|
6月前
|
移动开发 监控 小程序
mPaaS常见问题之uniapp ios端云打包的配置config文件如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
183 0
|
6月前
|
缓存 小程序 Android开发
mPaaS问题之iOS调用插件的时候提示没有配置mpaas. Config文件如何解决
mPaaS配置是指在mPaaS平台上对移动应用进行的各项设置,以支持应用的定制化和优化运行;本合集将提供mPaaS配置的操作指南和最佳实践,助力开发者高效管理和调整移动应用的设置。
134 1