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

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

iOS 上传多个文件

 

 

上传文件格式

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;}

 

 

 

 

参照:https://yq.aliyun.com/articles/663460

转载于:https://www.cnblogs.com/OIMM/p/11540406.html

你可能感兴趣的文章
敏捷软件开发(3)---COMMAND 模式 & Active Object 模式
查看>>
poj 1062 昂贵的聘礼 解题报告
查看>>
get the page name from url
查看>>
visual studio中csproj文件中的project guid改为小写 ( notepad++ 正则)
查看>>
TeeChart显示三维的图形,使用Surface
查看>>
如何使用 Idea 远程调试 Java 代码
查看>>
加密,解密
查看>>
在C#代码中应用Log4Net(一)简单使用Log4Net
查看>>
[转]如何写软件项目技术标
查看>>
每日站立会议个人博客五
查看>>
ddd
查看>>
死磕 java同步系列之AQS起篇
查看>>
利用Lucene把文本的字体格式进行改动,然后输出到一个新的文件里
查看>>
[Openstack] Expecting an auth URL via either --os-auth-url or env[OS_AUTH_URL]
查看>>
How to Create Modifiers Using the API QP_MODIFIERS_PUB.PROCESS_MODIFIERS
查看>>
待飞笔记(第一天 )
查看>>
解惑好文:移动端H5页面高清多屏适配方案
查看>>
traefik添加多证书
查看>>
PhantomJs 笔记
查看>>
js设计模式--语言类型
查看>>