zoukankan      html  css  js  c++  java
  • iOS开发网络篇—文件的上传

    iOS开发网络篇—文件的上传

    说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中。本文介绍如何不借助第三方框架实现iOS开发中得文件上传。

      由于过程较为复杂,因此本文只贴出部分关键代码。

    主控制器的关键代码:

    YYViewController.m

    #import "YYViewController.h"
    
    #define YYEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding]
    
    @interface YYViewController ()
    
    @end
    
    @implementation YYViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    - (void)upload:(NSString *)name filename:(NSString *)filename mimeType:(NSString *)mimeType data:(NSData *)data parmas:(NSDictionary *)params
    {
        // 文件上传
        NSURL *url = [NSURL URLWithString:@"http://192.168.1.200:8080/YYServer/upload"];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        request.HTTPMethod = @"POST";
        
        // 设置请求体
        NSMutableData *body = [NSMutableData data];
        
        /***************文件参数***************/
        // 参数开始的标志
        [body appendData:YYEncode(@"--YY
    ")];
        // name : 指定参数名(必须跟服务器端保持一致)
        // filename : 文件名
        NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name="%@"; filename="%@"
    ", name, filename];
        [body appendData:YYEncode(disposition)];
        NSString *type = [NSString stringWithFormat:@"Content-Type: %@
    ", mimeType];
        [body appendData:YYEncode(type)];
        
        [body appendData:YYEncode(@"
    ")];
        [body appendData:data];
        [body appendData:YYEncode(@"
    ")];
        
        /***************普通参数***************/
        [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
            // 参数开始的标志
            [body appendData:YYEncode(@"--YY
    ")];
            NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name="%@"
    ", key];
            [body appendData:YYEncode(disposition)];
    
            [body appendData:YYEncode(@"
    ")];
            [body appendData:YYEncode(obj)];
            [body appendData:YYEncode(@"
    ")];
        }];
        
        /***************参数结束***************/
        // YY--
    
        [body appendData:YYEncode(@"--YY--
    ")];
        request.HTTPBody = body;
        
        // 设置请求头
        // 请求体的长度
        [request setValue:[NSString stringWithFormat:@"%zd", body.length] forHTTPHeaderField:@"Content-Length"];
        // 声明这个POST请求是个文件上传
        [request setValue:@"multipart/form-data; boundary=YY" forHTTPHeaderField:@"Content-Type"];
        
        // 发送请求
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            if (data) {
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
                NSLog(@"%@", dict);
            } else {
                NSLog(@"上传失败");
            }
        }];
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        // Socket 实现断点上传
        
        //apache-tomcat-6.0.41/conf/web.xml 查找 文件的 mimeType
    //    UIImage *image = [UIImage imageNamed:@"test"];
    //    NSData *filedata = UIImagePNGRepresentation(image);
    //    [self upload:@"file" filename:@"test.png" mimeType:@"image/png" data:filedata parmas:@{@"username" : @"123"}];
        
        // 给本地文件发送一个请求
        NSURL *fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt" withExtension:nil];
        NSURLRequest *request = [NSURLRequest requestWithURL:fileurl];
        NSURLResponse *repsonse = nil;
        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&repsonse error:nil];
        
        // 得到mimeType
        NSLog(@"%@", repsonse.MIMEType);
        [self upload:@"file" filename:@"itcast.txt" mimeType:repsonse.MIMEType data:data parmas:@{
                                                                                                  @"username" : @"999",
                                                                                                  @"type" : @"XML"}];
    }
    
    @end

    补充说明:

    文件上传请求数据格式

    部分文件的MIMEType

     

  • 相关阅读:
    Serialize and Deserialize Binary Tree
    sliding window substring problem汇总贴
    10. Regular Expression Matching
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接
    程序员如何写一份合格的简历?(附简历模版)
    9个提高代码运行效率的小技巧你知道几个?
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第六章 存储器层次结构
    24张图7000字详解计算机中的高速缓存
    《深入理解计算机系统》(CSAPP)实验四 —— Attack Lab
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第五章 优化程序性能
  • 原文地址:https://www.cnblogs.com/yipingios/p/5562681.html
Copyright © 2011-2022 走看看