美文网首页iOS开发
文件上传(原理)

文件上传(原理)

作者: zhazha | 来源:发表于2015-07-15 08:24 被阅读1099次

    原始的方式实现文件上传

    文件上传的步骤

    • 首先定义一些基本的宏,方便后面使用,因为这些代码实在恶心,不能出现任何差错
    #define ZMJBoundary @"zmj"
    #define ZMJEncode(string) [string dataUsingEncoding:NSUTF8StringEncoding]
    #define ZMJNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]
    
    • 创建POST请求
    NSURL *url = [NSURL URLWithString:@"www.baidu.com"];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        request.HTTPMethod = @"POST";
    
    • 设置请求头(告诉告诉服务器,这是一个文件上传的请求)
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", ZMJBoundary] forHTTPHeaderField:@"Content-Type"];
    
    • 设置请求体
      • 先创建一个空的请求体
    NSMutableData *body = [NSMutableData data];
    
    - 如果是文件参数,必须严格按照以下格式
    ```
    --分割线\r\n
    

    Content-Disposition: form-data; name="参数名"; filename="文件名"\r\n
    Content-Type: 文件的MIMEType\r\n
    \r\n
    文件数据
    \r\n

    ```
    ```objc
    // 实现代码
    
     // 分割线
    [body appendData:ZMJEncode(@"--")];
    [body appendData:ZMJEncode(ZMJBoundary)];
    [body appendData:ZMJNewLine];
    
    // 文件参数名
    [body appendData:ZMJEncode([NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"test.png\""])];
    [body appendData:ZMJNewLine];
    
    // 文件的类型
    [body appendData:ZMJEncode([NSString stringWithFormat:@"Content-Type: image/png"])];
    [body appendData:ZMJNewLine];
    
    // 文件数据
    [body appendData:ZMJNewLine];
    UIImage *image = [UIImage imageNamed:@"placeholder"];
    [body appendData:UIImagePNGRepresentation(image)];
    // [body appendData:[NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/test.png"]];
    [body appendData:ZMJNewLine];
    ```
    - 如果是非文件参数,同样必须遵守以下格式
    ```
     --分割线\r\n
     Content-Disposition: form-data; name="参数名"\r\n
     \r\n
     参数值
     \r\n
    ```
    ```objc
    // 非文件参数代码实现
    
     // 分割线
    [body appendData:ZMJEncode(@"--")];
    [body appendData:ZMJEncode(ZMJBoundary)];
    [body appendData:ZMJNewLine];
    
    // 参数名
    [body appendData:ZMJEncode([NSString stringWithFormat:@"Content-Disposition: form-data; name=\"username\""])];
    [body appendData:ZMJNewLine];
    
    // 参数值
    [body appendData:ZMJNewLine];
    [body appendData:ZMJEncode(@"jack")];
    [body appendData:ZMJNewLine];
    
    ```
    - 最后,添加结束标记,必须遵守格式
    ```
    --分割线--\r\n
    
    ```
    ```objc
    // 结束标记代码实现
    
    [body appendData:ZMJEncode(@"--")];
    [body appendData:ZMJEncode(ZMJBoundary)];
    [body appendData:ZMJEncode(@"--")];
    [body appendData:ZMJNewLine];
    ```
    - 设置请求体
    ```objc
    request.HTTPBody = body;
    ```
    
    • 利用NSURLConnection类发送异步请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
        }];
    

    相关文章

      网友评论

        本文标题:文件上传(原理)

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