使用NSURLSession 实现单个文件的上传

来源:互联网 发布:那个电视好 知乎 编辑:程序博客网 时间:2024/05/19 18:36

------------------------------------- 01 POST上传单个文件 ---------------------------------------*/


#define kBoundary @"boundary" 可随意定义字符串作为边界标识

重点:1.单个文件上传(四个步骤2.设置请求体格式

{

    为什么要上传文件:

    

    - 以前很多服务器对上传文件的大小有限制,PHP 限制是 2M

    - 目前很多服务器不仅不限制大小,而且鼓励上传多个文件!

    - 云服务器的普及!

    - 软件商希望获得更多的用户数据!

    

    提示:abc 的目录是用来保存上传文件的,需要设置访问权限!

    

    <1文件上传使用 POST 方法.

    

    // 请求为可变请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    // 制定请求方法为 POST

    request.HTTPMethod = @"POST";

    

    <2设置请求头,告诉服务器请求体中的内容包含文件参数.

    [request setValue:@"multipart/form-data; boundary=kBoundary" forHTTPHeaderField:@"Content-Type"];

    

使用 NSMutableData 把每个字符串装换成 二进制数据拼接起来

    <3设置请求体(注意:必须严格按照格式设置).

    {

        // 上边界

        --boundary\r\n

        Content-Disposition: form-data; name=userfile; filename=555\r\n

        Content-Type: application/json\r\n\r\n

        

        

        文件内容的二进制数据

 NSData * data = [NSdata dataWIthContentOfFIle: filePath ];

        

        // 下边界

        \r\n--boundary--

        

        

        注意1:请求体内容分为三个部分:

        

        * 上边界部分,告诉服务器要做数据上传,包含了服务器的接收字段name=userfile,文件在服务器中保存的名称filename=555,以及上传文件的数据类型 application/json(需要严格按照字符串格式来设置)

        

        * 上传文件的数据部分(二进制数据)

        

        * 下边界部分,严格按照字符串格式来设置.

        

        上边界部分和下边界部分的字符串,最后都要转换成二进制数据,和文件部分的二进制数据拼接在一起,作为请求体发送给服务器.

        

        

        注意2:

    

        * userfile => 负责上传文件脚本中的 字段名,开发的时候,可以咨询后端程序员

        * filename => 将文件保存在服务器上的文件名称

        * Content-Type: 客户端告诉服务器上传文件的文件类型

        

        注意3:

        

        * 每一行末尾需要有一定的 \r\n

        * 提示:有些服务器可以直接使用 \n,但是新浪微博如果使用 \n 上传文件,服务器会返回没有权限的错误!

        

    }

    

    <4发送请求( NSURLConnection异步发送请求)

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        //

        NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

        

        NSLog(@"%@",string);

    }];

    

}



[objc] view plain copy
  1. //  
  2. -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event  
  3. {  
  4.       
  5.     //创建连接  
  6.     NSString * urlStr=@"http://127.0.0.1/upload/upload.php";  
  7.       
  8.     NSURL * url=[NSURL URLWithString:urlStr];  
  9.       
  10.     NSMutableURLRequest * request=[NSMutableURLRequest requestWithURL:url];  
  11.       
  12.     //设置类型  
  13.     request.HTTPMethod=@"POST";  
  14.       
  15.       
  16.     //设置网页头  
  17.     //multipart/form-data; boundary=---------------------------181604414868920625855258642  
  18.       
  19.     NSString * type=[NSString stringWithFormat:@"multipart/form-data; boundary=%@",kBoundary];  
  20.     //设置文件头  
  21.     [request setValue:type forHTTPHeaderField:@"Content-Type"];  
  22.       
  23.      
  24.     //获取请求体  
  25.     request.HTTPBody=[self getHttpBody];  
  26.       
  27.     //发送请求  
  28.    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {  
  29.          
  30.        NSString * msg=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
  31.        NSLog(@"%@",msg);  
  32.          
  33.    }] resume];  
  34.       
  35. }  
  36.   
  37.   
  38.   
  39. -(NSData *)getHttpBody  
  40. {  
  41.       
  42.     NSMutableData * data=[NSMutableData data];  
  43.       
  44.     //获取文件路径  
  45.     NSString * path=[NSString stringWithFormat:@"/Users/yangwenleimac/Desktop/学习网站.rtf"];  
  46.     //通过path 获取文件信息  
  47.     NSString * filePath=[NSString stringWithFormat:@"file://%@",path];  
  48.       
  49.     //通过转码来 转码中文  
  50.     filePath=[filePath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  51.       
  52.       
  53.     //获取文件信息  
  54.     NSURL * fileUrl=[NSURL URLWithString:filePath];  
  55.       
  56.     NSURLRequest * fileRequest=[NSURLRequest requestWithURL:fileUrl];  
  57.       
  58.     NSURLResponse * response=nil;  
  59.       
  60.     [NSURLConnection sendSynchronousRequest:fileRequest returningResponse:&response error:NULL];  
  61.       
  62.     //打印 建议名称 ,和类型  
  63.     NSLog(@"%@,%@",response.suggestedFilename,response.MIMEType);  
  64.       
  65.       
  66.     //获取建议文件名的另外一种方式。获取文件名 (通过路径获取文件的后缀名)  
  67.     NSString * suggestedFileName= [path lastPathComponent];  
  68.       
  69.       
  70.   
  71.       
  72.       
  73.     //设置头部信息上边界  
  74.     NSMutableString * headerStr=[NSMutableString stringWithFormat:@"--%@\r\n",kBoundary];  
  75.       
  76.     [headerStr appendFormat:@"Content-Disposition: form-data; name=%@; filename=%@\r\n",@"userfile",@"11111"];  
  77.       
  78.     [headerStr appendFormat:@"Content-Type: %@\r\n\r\n",response.MIMEType];  
  79.       
  80.     [data appendData:[headerStr dataUsingEncoding:NSUTF8StringEncoding]];  
  81.       
  82.     NSData * fileData=[NSData dataWithContentsOfFile:path];  
  83.       
  84.     [data appendData:fileData];  
  85.       
  86.       
  87.     //设置尾部信息 下边界  
  88.     NSMutableString * footerStr=[NSMutableString stringWithFormat:@"\r\n--%@--",kBoundary];  
  89.       
  90.     [data appendData:[footerStr dataUsingEncoding:NSUTF8StringEncoding]];  
  91.       
  92.     return data;  
  93.       
  94. }  
原创粉丝点击