博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 上传多个文件
阅读量:7120 次
发布时间:2019-06-28

本文共 4914 字,大约阅读时间需要 16 分钟。

上传文件格式

POST /php/upload/upload.php HTTP/1.1Host: 127.0.0.1Content-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;}

转载地址:http://tysel.baihongyu.com/

你可能感兴趣的文章
例题9-6 UVa11400 Lighting System Design(DP)
查看>>
PAT1087 All Roads Lead to Rome (30)(最短路径+dfs+回溯)
查看>>
Arcgis Engine 添加一个Symbol符号样式步骤
查看>>
kafka 控制台命令
查看>>
alpha冲刺10
查看>>
睡觉了~~
查看>>
【LeetCode】28 - Implement strStr()
查看>>
Node.js与Sails~Model数据模型
查看>>
[转]没有找到 MFC42D.DLL,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。解决方法!...
查看>>
我再也不-或许永远不-用zend studio-受够了!
查看>>
软件工程(2019)第三次作业
查看>>
Java性能调优
查看>>
第 6 章 存储 - 039 - Data Volume 之 bind mount
查看>>
异步IO
查看>>
MySQL
查看>>
【转】Linux内核结构详解
查看>>
DevExpress学习03——label控件的背景色问题
查看>>
Cass环境下光标无显示
查看>>
linux系统监控命令汇总
查看>>
谷歌:全球10大爬升最快搜索关键字排行榜 Google Zeitgeist 2011
查看>>