使用 Alamofire 和 multipart/form-data

Using Alamofire and multipart/form-data

我无法以正确的方式接近提供给我的 API 以得到我正在寻找的响应。我已经使用 Swift 和 Alamofire 一段时间了,但这是我第一次使用 multipart/form-data 上传图片。我可以使用 Postman 上传图像,但无法使用 Alamofire 框架让我的应用程序发送相同的消息。

我的Swift代码:

func postFulfilWish(wish_id: Int, picture : UIImage, completionHandler: ((AnyObject?, ErrorType?) -> Void)) {

    var urlPostFulfilWish = Constant.apiUrl;
    urlPostFulfilWish += "/wishes/";
    urlPostFulfilWish += String(wish_id);
    urlPostFulfilWish += "/fulfill/images"  ;

    let image : NSData = UIImagePNGRepresentation(UIImage(named: "location.png")!)!

    Alamofire.upload(.POST, urlPostFulfilWish, headers: Constant.headers, multipartFormData: { multipartFormData in
        multipartFormData.appendBodyPart(data: image, name: "file")
        },
        encodingCompletion: { encodingResult in
            switch encodingResult {
            case .Success(let upload, _, _):
                upload.responseJSON { response in
                    //This is where the code ends up now
                    //So it's able to encode my message into multipart/form-data but it's not doing it in the correct way for the API to handle it
                    debugPrint(response)
                }
            case .Failure(let encodingError):
                print(encodingError)
            }
        }
    )
}

您正在做 debugPrint(response)。你大概应该做另一个 switch response.result { ... } 并看看你是否得到 .Success.Failure 作为请求的结果,如果成功,你会查看响应对象的内容(或者如果失败,看失败报错)。您需要查看那个 result 来诊断它是否成功。

Alamofire.upload(.POST, urlPostFulfilWish, headers: Constant.headers, multipartFormData: { multipartFormData in
    multipartFormData.appendBodyPart(data: image, name: "file")
}) { encodingResult in
    switch encodingResult {
    case .Success(let upload, _, _):
        upload.responseJSON { response in
            switch response.result {
            case .Success(let value):
                print(value)
            case .Failure(let error):
                print(error)
            }
        }
    case .Failure(let encodingError):
        print(encodingError)
    }
}

如果还没有回答,最近我在使用 Alamofire 使用表单数据上传图像时遇到了同样的问题。

我能够使用 Postman 完全按照此 post 中显示的方式上传图像,但无法在我的应用程序中使用 Alamofire 进行上传。

您需要检查两件事,首先是服务器期望的文件名,其次是用于在 multipartFormData 闭包中附加正文部分的方法。

这两种方法在我的情况下不起作用 -

multipartFormData.appendBodyPart(data: imageData, name: "file")

这一个都不是

multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: name)

但在这方面工作出色 -

multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "file.jpeg", mimeType: "image/jpeg")

问题基本上是服务器找不到具有预期名称的文件。

我希望这可以帮助人们节省时间来思考为什么它不起作用。

我认为这个问题已经过时了,但只要没有被接受的答案,请尝试以下操作:

multipartFormData.appendBodyPart(data: imageData, name: "name", fileName: "filename", mimeType: mimeType)

我最近在 body 中发布带有参数的多部分请求时从服务器收到了 404。我使用的是 UIImagePickerController(return 是一个 UIImage 的委托),然后我发送了它的 PNG 表示。

这只发生在磁盘上的 JPEG 文件中。奇怪的是,这个问题似乎只影响在 body 中也有参数的多部分请求。当 API 端点不需要任何其他东西时,它工作正常。

我的猜测是,在 JPEG -> UIImage -> PNG 表示形式中发生了一些奇怪的事情,导致了某种问题,奇怪的是,这些问题似乎只出现在多部分请求中,这些请求也有参数body。可能有一些特殊字符使服务器无法识别请求,只是 return 404.

我最终通过发送所选图像的 UIImageJPEGRepresentation 而不是 UIImagePNGRepresentation 来修复它,并且没有出现此类错误。