zoukankan      html  css  js  c++  java
  • iOS 上传多个文件

    iOS 上传多个文件

    上传文件格式

    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];
            // 判断是否是第一个文件,如果是则不需要添加"
    "
            if (idx != 0) {
                [mString appendString:@"
    "];
            }
            [mString appendFormat:@"--%@
    ", kBOUNDARY];
            [mString appendFormat:@"Content-Disposition: form-data; name=%@; filename=%@
    ", fieldName, [obj lastPathComponent]];
            [mString appendString:@"Content-Type: application/octet-stream
    "];
            [mString appendString:@"
    "];
            [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:@"
    --%@
    ", kBOUNDARY];
            [mString appendFormat:@"Content-Disposition: form-data; name=%@
    ", key];
            [mString appendString:@"
    "];
            [mString appendFormat:@"%@", obj];
            [mData appendData:[mString dataUsingEncoding:NSUTF8StringEncoding]];
        }];
        
        // 结束语句
        NSString *end = [NSString stringWithFormat:@"
    --%@--", kBOUNDARY];
        [mData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
    
        return mData.copy;
    }

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

  • 相关阅读:
    python自学Day01(自学书籍python编程从入门到实践)
    关于要不要转行做程序员的建议
    什么是高并发?
    看了就想收藏的文章链接
    java反射的理解
    Mac执行sh批处理文件出现permission denied
    Error running 'lis [clean]': No valid Maven installation found. Either set the home directory in the configuration dialog or set the M2_HOME environment variable on your system.
    Error running 'Tomcat 8.5.37': Unable to open debugger port (127.0.0.1:55358): java.net.SocketException "socket closed"
    浅谈JS-ES6新特性
    ==和equals的区别
  • 原文地址:https://www.cnblogs.com/OIMM/p/11540406.html
Copyright © 2011-2022 走看看