【问题标题】:Alamofire Multiform Upload Image with ParametersAlamofire Multiform 上传带参数的图片
【发布时间】:2019-08-18 23:20:52
【问题描述】:

我正在使用 Alamofire 将图像上传到服务器上,这种方法效果很好,我已经在很多项目中使用过。

我使用以下代码使用多格式数据在我的服务器上上传图像。

Alamofire.upload( multipartFormData: { multipartFormData in

    for (key, value) in parameters {
        if let data = (value as! String).data(using: .utf8) {
            multipartFormData.append(data, withName: key)
        }
    }

    let imageData = image?.pngData()

    multipartFormData.append(imageData!, withName: "profile_image", fileName: "profileImage", mimeType: "")

}, to: getURL(.addProfile), headers: getHeaders(), encodingCompletion: { encodingResult in

    switch encodingResult {

    case .success(let upload, _, _):

        upload.response(completionHandler: { (defaultDataResponse) in

            guard let httpResponse = defaultDataResponse.response else {
                completion(nil, defaultDataResponse.error)
                return
            }

            if httpResponse.statusCode == 200 {

                do {

                    let genericModel = try JSONDecoder().decode(ProfileImageModel.self, from: defaultDataResponse.data!)
                    completion(genericModel, nil)

                } catch {

                    completion(nil, error)
                }

            } else {
                completion(nil, defaultDataResponse.error)
            }
        })

    case .failure(let encodingError):
        completion(nil, encodingError)
    }
})

这很好用。

我的问题在这里,在 api 中传递了额外的参数。

for (key, value) in parameters {
    if let data = (value as! String).data(using: .utf8) {
        multipartFormData.append(data, withName: key)
    }
}

以上代码会将字符串值转换为数据并附加到multipartFormData。它适用于以下类型的请求结构。

{
    "first_name": "ABC",
    "last_name": "XYZ",
    "bio": "iOS Developer"
}

当我有以下类型的请求结构时该怎么办?

{
    "first_name": "ABC",
    "last_name": "XYZ",
    "bio": "iOS Developer"
    "location": {
        "full_address": "My Location",
        "latitude": "23.0000",
        "longitude": "76.0000"
    }
}

请帮助实现这一目标。

【问题讨论】:

  • 这取决于你的服务器期望什么。
  • 例如,如果您的服务器需要 json 编码的字符串,您可以将 location 字典转换为 JSON 字符串,并将该数据附加到您的表单中
  • 好的,我明白你的意思了。让我检查一下。
  • 如果它适合你,让我知道作为答案发布
  • @arturdev,当然。

标签: ios swift alamofire


【解决方案1】:

使用这个功能

 func requestUploadImage(_ strURL : String, imageData : Data? ,params : [String : AnyObject]?, headers : [String : String]?, success:@escaping (NSDictionary) -> Void, failure:@escaping (Error) -> Void){
//        let  params = ["id": "101", "name": "Navin", "timezone": "2018-07-26  03:17:06" , "image": imageData] as [String : AnyObject]
  //
        //  CommonMethodsModel.showProgrssHUD()
    let url = URL(string: baseURL + strURL)!
    let parameters = params //Optional for extra parameter

        Alamofire.upload(multipartFormData: { multipartFormData in
            multipartFormData.append(imageData!, withName: "image",fileName: "file.jpeg", mimeType: "image/jpeg")
            print(imageData , params)
            for (key, value) in parameters! {
                multipartFormData.append(value.data(using: String.Encoding.utf8.rawValue)!, withName: key)
            } //Optional for extra parameters
        },
                 usingThreshold: UInt64.init(),         to:url, method: .post)
        { (result) in
//             CommonMethodsModel.HidePrgressHUD()
            switch result {
            case .success(let upload, _, _):

                upload.uploadProgress(closure: { (progress) in
                    print("Upload Progress: \(progress.fractionCompleted)")
                })

                upload.responseJSON { response in
                    print(response.result.value)

                    success(response.result.value as! NSDictionary )
                }

            case .failure(let encodingError):
                print(encodingError)
            }
        }

    }

【讨论】:

  • 我使用相同的方法,只需检查我的参数结构。这在有位置对象时不起作用,应用程序会崩溃。
  • @MayurKarmur 不要使用位置对象,为什么不创建位置字典并使用它。你试过这个吗?
  • 我正在使用此代码,它在我的复杂数组字典组合项目中工作得非常好,请在我的方法中检查 params
  • @dahiya_boy 我认为 withName 和 fileName 只是字符串,你可以传递任何你想要的。
  • @dahiya_boy 1) name :与Content-Disposition HTTP 标头中的数据关联的名称。 2)fileName:与Content-Disposition HTTP 标头中的数据关联的文件名。3)mimeType:与Content-Type HTTP 标头中的数据关联的MIME 类型。 github.com/Alamofire/Alamofire/blob/…
猜你喜欢
  • 1970-01-01
  • 2019-03-16
  • 2023-03-22
  • 2016-10-06
  • 1970-01-01
  • 2019-02-19
  • 2015-07-11
  • 2019-05-18
相关资源
最近更新 更多