【问题标题】:How to send a jpeg file as a parameter in a POST request using AlamoFire如何使用 AlamoFire 在 POST 请求中将 jpeg 文件作为参数发送
【发布时间】:2016-11-19 21:57:48
【问题描述】:

我正在尝试使用 Alamofire 发出服务器请求。 我需要发送一个文件作为参数。

    var parameters: [String: AnyObject] = [:]
    parameters["PAYLOAD"] = payloadString // String
    parameters["FINGERPRINT"] = deviceUniqueIdString // String

我有一个 UIImage,我使用 UIImageJPEGRepresentation() 将其转换为 NSData

    let imageData = UIImageJPEGRepresentation(myUIImage, 1.0)
    parameters["IMAGE_FILE"] = imageData

然后,我使用 Alamofire 发送请求:

    Alamofire.request(.POST, apiURL, parameters: parameters).responseJSON { response in

    }

当我只发送有效载荷和指纹参数时,此请求有效,但当我包含“IMAGE_FILE”参数时,服务器返回错误。

我应该如何发送 UIImage?

【问题讨论】:

    标签: ios swift alamofire


    【解决方案1】:

    除了@Fujia 的回复,我还想补充一个例子。这是我最近用来发布 png 文件的方法:

    func WasperEntrepriseImageUploadCall(method: Alamofire.Method, imageData: NSData, parameters: [String: AnyObject]?, headers: [String: String]?, urlToPost: String, 
        progressionHandler: (bytesWritten: Int, totalBytesWritten: Int, totalBytesExpected: Int) -> (), 
        completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<AnyObject,NSError>, NSData?) -> ()){
    
        Alamofire.upload(
            method, urlToPost, headers: headers,
            multipartFormData: { multipartFormData in
                multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "doesntmatter", mimeType: "image/png")
    
                if let params = parameters{
                    for (key, value) in params {
                        multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
                    }
                }
            },
            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .Success(let upload, _, _):
    
                    upload.progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in
                        progressionHandler(bytesWritten: Int(bytesWritten), totalBytesWritten: Int(totalBytesWritten), totalBytesExpected: Int(totalBytesExpectedToWrite))
                    }
                    upload.response { response in
                                              }.validate()
                        .responseJSON { response in
    
                            if let resp = response.response{
                                print(resp.statusCode)
                                print(response.result.value)   // result of response serialization                          
                            }
                            completionHandler(response.request,response.response,response.result, response.data)
                    }
                case .Failure(let encodingError):
                    print(encodingError)
                }
            }
        )
    }
    

    不是最好的解决方案,但它应该让您领先一步。我相信同时需要 SwiftyJSON 和 Alamofire 3.0。为您提供一个可能有用的进度完成处理程序。您应该可以在这里找到更详细的答案:Uploading file with parameters using Alamofire

    【讨论】:

      【解决方案2】:

      使用Alamofire.upload(_:multipartFormData:encodingMemoryThreshold:encodingCompletion:) 代替Alamofire.request。您可以在多部分闭包中添加参数(包括字符串和数据)。

      【讨论】:

        猜你喜欢
        • 2016-08-02
        • 1970-01-01
        • 2015-10-25
        • 1970-01-01
        • 2011-05-06
        • 2013-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多