【问题标题】:Unable to send Multipart-Form data with AFNetworking 3.0无法使用 AFNetworking 3.0 发送 Multipart-Form 数据
【发布时间】:2016-04-19 14:28:25
【问题描述】:

目前,我正在尝试在 Objective C 中编写一个方法,该方法接收 UIImage 和 NSString 并向服务器发出 POST 请求。不幸的是,我很难让它发送任何东西。当我用 HTML 表单尝试表单时,我能够成功上传照片和参数。但是,我无法在我的 iOS 应用程序中复制它。当我尝试发出 POST 请求时,我不断收到 404 错误。

我尝试了两种不同的方法来根据其 Github 页面发送多格式数据 POST 请求,但均未成功。我已经在 Xcode 中调试了 UIImage,我发现它确实存在。我认为这与我发送的参数有关。参数应该是 formDataAppend 的一部分,还是就像我在下面所做的那样作为字典?

注释部分对应其 Github 上的教程。未注释的部分包含浏览 Stackoverflow 仍然无济于事的部分。

+(void) uploadPhotoWithID:(NSString *)ownerID andPhotoImage:(UIImage *)image andCompletionHandler:(void (^)(MZPhoto *, NSError *))callback{

    NSData *imageData = UIImageJPEGRepresentation(image, 1);
    NSDictionary *parameters = @{@"owner_id": ownerID};

//    NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:upload_photo_url parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
//        [formData appendPartWithFileData:imageData name:@"photo" fileName:@"temp.jpg" mimeType:@"image/jpeg"];
//    } error:nil];
//    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
//    
//    NSURLSessionUploadTask *uploadTask  = [manager uploadTaskWithStreamedRequest:request progress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
//        if(error){
//            NSLog(@"File Upload Failed");
//            
//        }
//        else{
//            NSLog(@" %@", responseObject);
//            MZPhoto *photo = [[MZPhoto alloc] initWithDictionary:responseObject error:nil];
//            callback(photo, nil);
//        }
//    }];
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:upload_photo_url]];
    [manager POST:upload_photo_url parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        [formData appendPartWithFileData:imageData name:@"photo" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
    } progress:nil
          success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
              NSLog(@" %@", responseObject);
          } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
              NSLog(@" Failed");
          }];



}

这是我的 Node.JS 函数,

exports.upload_photo = function(req, res, next) {
    var owner_id = req.body.owner_id;
    console.log(owner_id);
    pg.connect(connectionString, function(err, client, done) {
        if (err) {
            done();
            console.log(err);
            return res.status(500).json({success: false, data: err});
        }

        var query = client.query("INSERT INTO photos (likes, dislikes, user_id) " +
                                    "VALUES (0, 0, $1) RETURNING photo_id, likes, dislikes, user_id", [owner_id]);
        var result;
        console.log(req.file);

        query.on('row', function(row) {
            row.file_url =  baseFileURL + row.photo_id + '.jpg';
            result = row;
        });

        query.on('end', function() {
            done();
            fs.rename('./static/photos/' + req.file.filename, './static/photos/' + result.photo_id + '.jpg', function(err) {
                if(err) console.log("Error Renaming the file!");
                return res.json(result);
            });
        });
    });
    console.log("Received photo upload from: " + owner_id);
}

【问题讨论】:

    标签: ios objective-c node.js


    【解决方案1】:

    尝试关注function

    - (void) postServerRequest:(NSDictionary *)paramDict withData:(NSData*)fileData andType:(uploadType)uploadType Callback:(ResponseBlock) block{
    
        NSString * strServiceURL = @"Your Webservice URL";
    
    
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        manager.requestSerializer = [AFJSONRequestSerializer serializer];
        manager.responseSerializer = [AFJSONResponseSerializer serializer];
        [manager.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
    
    
        [manager POST:strServiceURL parameters:paramDict constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
            if (fileData!=nil){
                [formData appendPartWithFileData:fileData name:@"Key name on which you will upload file" fileName:@"Image name" mimeType:@"image/jpeg"];
            }
    
        } success:^(AFHTTPRequestOperation *operation, id responseObject) {
            DLOG(@"Success: %@", responseObject);
            block(responseObject,nil);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            DLOG(@"Error: %@", error);
            block (nil , error);
        }];
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2012-10-01
      • 2021-01-07
      相关资源
      最近更新 更多