• iOS-AFNetworking参数和多文件同时上传【多文件上传】


    1. 前言

        在项目开发中,我们经常需要上传文件,例如:上传图片,上传各种文件,而有时也需要将参数和多个文件一起上传,不知道大家的项目中遇到了没有,我在最近的项目中,就需要这样的一个功能:同时上传参数、多张图片和音频;

    2. 功能实现

    在实现此功能之前,需要引入第三方AFNetworking,这是一个非常强大的网络开发工具,这里我就不多说了,下面是我用此工具,封装的一个同时上传参数和多个文件的方法:

    2.1 方法名

    /**
    
     多文件上传,支持同时上传参数、多个图片、多个音频,【图片为date流,音频为沙盒路径,用数组传过去】
    
    url:请求的网络地址
    
    pram:请求参数【我一般用dictionary】
    
    arrayImg:图片date类型数组
    
    arrayAudio:音频地址数组
    
    success:上传成功回调
    
    faile:上传失败回调
    
    progress:上传进度回调
    
     */
    
    + (void)uploadMoreFileHttpRequestURL:(NSString *)url  RequestPram:(id)pram arrayImg:(NSArray *)arrayImg arrayAudio:(NSArray *)arrayAudio RequestSuccess:(void(^)(id respoes))success RequestFaile:(void(^)(NSError *erro))faile UploadProgress:(void(^)(NSProgress * uploadProgress))progress;

    2.2 方法实现

    + (void)uploadMoreFileHttpRequestURL:(NSString *)url  RequestPram:(id)pram arrayImg:(NSArray *)arrayImg arrayAudio:(NSArray *)arrayAudio RequestSuccess:(void(^)(id respoes))success RequestFaile:(void(^)(NSError *erro))faile UploadProgress:(void(^)(NSProgress * uploadProgress))progress{
    
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
        [manager POST:url parameters:pram constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    
            ///用时间设置文件名
    
            NSDate *date = [NSDate date];
    
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    
            [formatter setDateFormat:@"yyyyMMddhhmmss"];
    
            NSString *dateNow = [formatter stringFromDate:date];
    
     
    
            NSString *imgFileId = @"handsomekkImg";
    
            //  NSString *avdioFileId = @"ebookAvdio";
    
            ///图片文件data追加
    
            for (int i = 0; i < arrayImg.count; i++) {
    
                ///文件名:这是多个文件名不一样,多以我就用i实现
    
                NSString *fileName = [NSString stringWithFormat:@"%@%@%d.png",imgFileId,dateNow,i];
    
                ///图片支持类型jpg/png/jpeg
    
                [formData appendPartWithFileData:arrayImg[i] name:[NSString stringWithFormat:@"%@%d",imgFileId,i] fileName:fileName mimeType:@"jpg/png/jpeg"];
    
            }
    
            ///  此处是音频,我传的是音频文件本地沙盒地址,所以用 appendPartWithFileURL 方法
    
            ///   for (int i = 0; i < arrayAudio.count; i++) {
    
            ///    NSString *fileName = [NSString stringWithFormat:@"%@%@%d.caf",avdioFileId,dateNow,i];
    
            ///   [formData appendPartWithFileURL:[NSURL URLWithString:arrayAudio[i]] name:[NSString stringWithFormat:@"%@%d",arrayAudio,i] fileName:fileName mimeType:@"application/octet-stream" error:nil]; 
    
            ///    }
    
     
    
        } progress:^(NSProgress * _Nonnull uploadProgress) {
    
             ///进度回调
    
             progress(uploadProgress);
    
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
           ///上传功能回调
    
            if (success) {
    
                success(responseObject);
    
            }
    
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
            ///失败回调
    
            faile(error);
    
        }];
    
    }

    方法中,我们不要求上传的文件名固定,多以文件名不一样就可以,后台去取出来;可以根据自己的需求,定义上传的文件名就可以。

  • 相关阅读:
    【OS_Windows】用微pe制作启动盘安装操作系统
    技术列表
    RPC 的概念模型与实现解析
    asp.net站点阻止某个文件夹或者文件被浏览器访问
    常用插件
    安全相关
    asp.net mvc 请求处理流程,记录一下。
    接口的显示实现和隐式实现
    值类型与引用类型的简单测试,没有太多的理论,一目了然。
    IEnumerable、GetEnumerator、IEnumerator之间的关系。
  • 原文地址:https://www.cnblogs.com/wangkejia/p/7587314.html
Copyright © 2020-2023  润新知