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
  • 相关阅读:
    python 利用条件运算符:学习成绩>=90分用A表示,60-89分之间的用B表示,60分以下的用C表示。
    【原创】jmeter解决接口参数MD5加密的问题
    【原创】python+selenium+ddt+unittest实现web功能自动化测试
    【原创】基于RBI的性能测试理念,通过jmeter快速定位接口最大并发用户数
    【原创】基于pyautogui库进行自动化测试
    【原创】面向对象版本地CPU资源占用监控脚本
    【原创】相对完整的一套以Jmeter作为工具的性能测试教程(接口性能测试,数据库性能测试以及服务器端性能监测)
    【部分原创】python实现视频内的face swap(换脸)
    【原创】python基于大数据现实双色球预测
    【原创】python爬虫获取网站数据并存入本地数据库
  • 原文地址:https://www.cnblogs.com/lyz0925/p/11609273.html
Copyright © 2011-2022 走看看