搜尋

首頁  >  問答  >  主體

ios - AFNetworking上传图片,

我这里用AFNetworking上传图片
报The data couldn’t be read because it isn’t in the correct format.有人帮忙看看是哪里出问题了么?下面是我写的代码。

    AFHTTPRequestOperationManager *m = [AFHTTPRequestOperationManager manager];
    m.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", @"application/json", nil];
    m.requestSerializer = [AFHTTPRequestSerializer serializer];
    [m.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
    
    NS_APPDebugLog(@"请求链接:%@/%@", urlString, parametersDic);
    
    [m POST:@"http://59.48.96.118:7001/portal/SI_USR00025/upload.do" parameters:nil
                constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        for (int i = 0; i < imagePickerArray.count; i++)
        {
            UIImage *portraitImg = imagePickerArray[i];
            portraitImg = [UIImage scaleToSize:portraitImg];
            portraitImg = [portraitImg fixOrientation];
            NSData *imageData = [NSData compressImage:portraitImg];
            [formData appendPartWithFileData:imageData
                                        name:[NSString stringWithFormat:@"img.img%d", i+1]
                                    fileName:@"image.png"
                                    mimeType:@"image/png"];
        }
    } success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
        NSLog(@"成功");
    } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
        NSLog(@"失败");
        dispatch_async(dispatch_get_main_queue(),^{failure(error);});
    }];
高洛峰高洛峰2888 天前346

全部回覆(3)我來回復

  • PHPz

    PHPz2017-04-18 09:20:14

    這裡有幾個問題:

    1. mime 的設定有些矛盾:

      [m.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
       [formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"img.img%d", i+1] fileName:@"image.png" mimeType:@"image/png"];

      這兩個地方你分別設定了兩種mime,multipart/form-dataimage/png。哪一個是正確的?需要跟後台溝通一下。

    2. 跟後台聯調一下,收到你的請求了嗎?請求什麼內容?他返回的什麼?這個錯似乎一般是解析json的時候報,也許是後台沒有回傳合法 json。另外,你的請求是一次性上傳多個文件,不知道你的後台介面是否支持,可以嘗試只傳一張圖片。

    3. AFNetworking 的區塊裡不需要調dispatch_async(dispatch_get_main_queue()...它已經是幫你回到主執行緒執行的。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:20:14

    能否把 imageData 的資料印出來?

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 09:20:14

    請問lz解決了嗎?
    我也遇到報The data couldn’t be read because it isn’t in the correct format.
    但是事實上圖片上傳成功了
    客戶端程式碼:- (IBAction)upload:(id)sender {

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
     NSString *url3 = @"http://127.0.0.1:5000/upload";

    [manager POST:url3 parameters:nil constructingBodyWithBlock:^(id _Nonnull formData) {

        UIImage *image = [UIImage imageNamed:@"star"];
        NSData *imageData = UIImagePNGRepresentation(image);
        NSString *fileName = @"star.png";
        [formData appendPartWithFileData:imageData
                                    name:@"file"
                                fileName:fileName
                                mimeType:@"image/png"];    
    } progress:^(NSProgress *_Nonnull uploadProgress) {
    } success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
        NSLog(@"upload completed:%@",responseObject);
    } failure:^(NSURLSessionDataTask *_Nullable task, NSError * _Nonnull error) {
        NSLog(@"upload failed");
        NSLog(@"%@",error.localizedDescription);
    }];

    }

    後端程式碼(python):
    class receive(restful.Resource):

    def post(self):
        file = request.files['file']
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], 'star2.png'))
        return 'upload completed'
    

    api.add_resource(receive, '/upload', methods=['POST'])

    回覆
    0
  • 取消回覆