使用AFNetWorking 上傳文件/圖片


一 .

 

用AFHTTPSessionManager中的這個方法

- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
     constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
                      progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress
                       success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                       failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure;

 

tokenId可以作為參數放到parameters

然后注意file字段:這個file 就是

 

[formData appendPartWithFileData:file[@"buff"] name:@"file" fileName:file[@"name"] mimeType:@"image/*"];

 



name的值。之前沒搞懂。file[@"buff"],file[@"name"] 這個是方法傳過來的字典,與這里說的主題沒關系。

詳細代碼:

 
        

 

 

如果是其他地方如頭像,則是不同的key。比如

[[WLFNetWorkManager shared] POST:FILE_UPLOAD_URL parameters:@{@"tokenId":tokenId} constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        
        [formData appendPartWithFileData:file[@"buff"] name:@"file" fileName:file[@"name"] mimeType:@"image/*"];
        
        
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
        //NSLog(@"uploadProgress = %@",uploadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSString *json = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSDictionary *retDict = [[WLFDataTransformTool shareInstance] dictionaryWithJsonString:json];
        complete(retDict);
        /*
         {
             code = 1;
             data =     {
                 fileId = 114587;
                 fileSize = 5081851;
                 fileUrl = "/11/2020/3/18/5c4e397d-13e8-4b05-bc18-3a093ca28dc6.jpg";
             };
             msg = "文件上傳成功";
         }
         */

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        faildBlock(error);
    }];

 

二.  之前項目一直用thrift。現在改成http, 為啥沒有用https,后台說他們在后台已經加密了。

這里也順便記錄一下thrift的使用步驟。庫地址:https://github.com/apache/thrift

 

后台邊寫好了thrift文件之后,然后在thrift/ 同級目錄下運行命令:

thrift -out /Users/udc/Desktop/thrift_interface -I ./ --gen cocoa udc_all.thrift

 

生成

udc_all.h
udc_all.m 

兩個OC文件。這兩個文件中就是相關接口,直接調用就可以了。另外一些模型啊,返回碼,狀態碼。都在thrift/文件中定義了,不用自己寫。

如果想生成其他語言接口文件,可以試試如下命令。
#thrift -out /Users/udc/Desktop/thrift_interface -I ./ --gen swift udc_all.thrift

#thrift -out /Users/udc/Desktop/thrift_interface -I ./ --gen cpp udc_all_cpp.thrift

#thrift -out /Users/udc/Desktop/thrift_interface -I ./ --gen js udc_all_js.thrift

 

用法簡略:

-(void)OC封裝的接口請求方法名{

    __unsafe_unretained  WLFAPIDataAccess *weakSelf = self;
    [self.asyncQueue addOperationWithBlock:^(void) {
        
        @try {
            
            self.transport = [[TSocketTransport alloc] initWithHostname:SERVER_HOST_IP port:SERVER_PORT];//用主機+IP初始化
            self.protocol = [[TBinaryProtocol alloc] initWithTransport:self.transport];
            self.server = [[UdcApiServiceClient alloc]initWithProtocol:self.protocol];
            
            NSError *error;
            FileInfoResp *fileresponseInfo = [self.server uploadFile:self.udchead file:fileData error:&error]; //調用上面生成udc_all.h文件中的接口 得到返回的數據模型 回調出去
            
            //DLog(@"UploadFile ret = %@",fileresponseInfo);
            // UploadFile ret = FileInfoResp(response:ResponseInfo(code:1,message:"文件上傳成功。"),fileInfo:FileInfo(fileId:24709,fileUrl:"/11/2018/11/8/8ad9212c-32ad-4d9f-8147-3c48077a21b3.JPG",fileName:"IMG_0005",fileSize:473044,originalFileName:"(null)",pkId:0))


            [self.transport close];//關閉thrift傳輸 避免浪費資源
            
            [self asyncRequestResultWith:fileresponseInfo complete:complete failed:faildBlock];
            
        }
        @catch (NSException *e) {
            NSString *errorMsg = e.description;
            //DLog(@" UploadFile Error %@", errorMsg);
            [weakSelf.mainQueue addOperationWithBlock:^(void) {
                complete(errorMsg);
            }];
        }
        
    }];


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM