美文网首页网络
iOS 上传多个文件

iOS 上传多个文件

作者: _凌浩雨 | 来源:发表于2018-01-07 16:27 被阅读1251次

    上传文件格式

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

    相关文章

      网友评论

      • 介和:// 结束语句
        NSString *end = [NSString stringWithFormat:@"\r\n--%@--", kBOUNDARY];

        这句不对,应该是:

        NSString *end = [NSString stringWithFormat:@"\r\n--%@--\r\n", kBOUNDARY];
        _凌浩雨:@Viviane_df2d 不好意思,不接
        _凌浩雨:应该没有问题吧?因为我也是成功测试过的

      本文标题:iOS 上传多个文件

      本文链接:https://www.haomeiwen.com/subject/scapnxtx.html