zoukankan      html  css  js  c++  java
  • NSURLSession的文件上传

    文件上传的步骤:

    (1)确定上传路径

    (2)创建“可变”请求对象

    (3)修改请求方法为POST

        --设置请求头信息,告诉服务器这是一个文件上传请求

        --按照固定的格式拼接数据

    (4)设置请求体信息(文件参数)

    (5)创建会话对象

    (6)根据会话对象来创建uploadTask

    (7)执行task发送请求上传文件

    代码示例如下:

    需要注意的是:拼接的数据是必须按照格式拼接,否则会报错。

    #import "ViewController.h"
    
    #define kBoundary @"----WebKitFormBoundaryXGAyMbuVkeaFc916"
    #define kNewLine  [@"
    " dataUsingEncoding:NSUTF8StringEncoding]
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        // (1)确定上传路径
        NSURL *url = [NSURL URLWithString:@"http://mbs.test.internet.zhiwangyilian.com/api/files/upload"];
        //(2)创建“可变”请求对象
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        //(3)修改请求方法为POST
        request.HTTPMethod = @"POST";
        // --设置请求头信息,告诉服务器这是一个文件上传请求
        //Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXGAyMbuVkeaFc916
        [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", kBoundary] forHTTPHeaderField:@"Content-Type"];
        //--按照固定的格式拼接数据  ----这个放在bodyData中拼接
        //(4)设置请求体信息(文件参数)  ----这个放在bodyData中拼接
        //(5)创建会话对象
        NSURLSession *session = [NSURLSession sharedSession];
        //(6)根据会话对象来创建uploadTask
        /**
         第一个参数:请求对象
         第二个参数:本应该放在请求体中的信息,如果放在请求头中,会被忽略
         */
        NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:[self bodyData] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            NSLog(@"---%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        }];
    //(7)执行task发送请求上传文件
        [uploadTask resume];
    }
    
    - (NSData *)bodyData {
        NSMutableData *data = [NSMutableData data];
        //01 拼接文件参数
        /**
         --分隔符
         Content-Disposition: form-data; name="file"; filename="22e93acbcced42dbb319a2fc0ecdcec9.jpg"
         Content-Type: image/jpeg
         空行
         文件数据
         --分隔符--
         */
        [data appendData:[[NSString stringWithFormat:@"--%@",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:kNewLine];
        //name=file,其中file是不能随便写的,服务器要求写什么就写什么
        [data appendData:[@"Content-Disposition: form-data; name="file"; filename="22e93acbcced42dbb319a2fc0ecdcec9.jpg"" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:kNewLine];
        //要上传文件的而进士数据类型,组成:大类型/小类型
        [data appendData:[@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:kNewLine];
        [data appendData:kNewLine];
        NSData *imageData = [NSData dataWithContentsOfFile:@"/Users/gao/Desktop/图片/课程图片/61149b0491243c749fc871e67550a7f6.png"];
        [data appendData:imageData];
        [data appendData:kNewLine];
        
        //02 拼接非文件参数--如果有非文件的数据,就加上这个拼接的格式
        /**
         --分隔符
         Content-Dispositon: form-data; name="useruame"
         空行
         abcdf(输入的内容)
         */
        [data appendData:[[NSString stringWithFormat:@"--%@",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:kNewLine];
        [data appendData:[@"Content-Dispositon: form-data; name="useruame"" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:kNewLine];
        [data appendData:kNewLine];
        [data appendData:[@"abscdd" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:kNewLine];
        
        //03 结尾表示
        [data appendData:[[NSString stringWithFormat:@"--%@--",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
        return data;
    }
    
    @end
  • 相关阅读:
    super().__init__()方法
    so the first day
    left join,right join,inner join,full join之间的区别
    C#中几种常用的集合的用法ArrayList集合HashTable集合List<T>集合Dictionary<K,V>集合及区别
    C#中Dictionary<string,string>的初始化 两种方式不同
    C#中Dictionary的初始化方式
    如何批量修改文件后缀名?cmd命令 ren *.gif *.jpg
    eclipse查看一个方法被谁引用(调用)的快捷键四种方式
    C# 数组集合
    Java-数组和集合简单使用
  • 原文地址:https://www.cnblogs.com/lyz0925/p/11609273.html
Copyright © 2011-2022 走看看