使用 Alamofire 上传图片时崩溃

Posted

技术标签:

【中文标题】使用 Alamofire 上传图片时崩溃【英文标题】:Crash while uploading image using Alamofire 【发布时间】:2018-04-19 12:58:35 【问题描述】:

我正在像这样使用 Alamofire 上传图片..

编辑:这是编辑后的代码...

    for img in images 

    let url = "http:my url"
    let headers = [

           "Accept": "application/json",
           "Authorization": self.accessToken
       ]

if let imageData = (UIImageJPEGRepresentation(img, 0.6)) 
let parameters: [String: String]  =
            [

                  "seller_id": "\(self.mySellerId)",
                 "offline_id": self.prodID,
                 "is_default": "1",
                "sequence": "\(sequenceCount)"
           ]

    Alamofire.upload(multipartFormData: (multipartFormData) in
               let filePath = NSURL(fileURLWithPath: url)

                    print(imageData)

                    multipartFormData.append (imageData, withName: "image", fileName: "\(Date().timeIntervalSince1970).jpg", mimeType: "image / jpg")


                    for (key, value ) in parameters 
                        print(key,value)

                        multipartFormData.append(value.data(using: .utf8)!, withName: key)
                    
                , to: url, method: .post, headers: headers)
                 (result) in
                    switch result 
                    case .success(let upload, _,_ ):


                        upload.uploadProgress(closure:  (progress) in
                            UILabel().text = "\((progress.fractionCompleted * 100)) %"
                            print (progress.fractionCompleted * 100)

                        )
                        upload.responseJSON  response in

                            if let JSON = response.result.value 
                                print(JSON)
                            else
                                print("Error")
                            
                        
                    case .failure(let encodingError):
                        print(encodingError)
                        break
                    
                
            
    

for (key, value) in parameters... 部分中,for 循环遍历所有值。但是当它到达图像数据部分时,它会崩溃说Could not cast value of type 'Foundation.Data' (0x10787b9f0) to 'Swift.String'

应该给出什么来修复错误..?

【问题讨论】:

当你 for 循环进入键,值:"product_image", imageDatavalue 已经是一个数据对象。不需要把它转换成Data,它不是一个字符串,所以你as! String让它崩溃。相反,检查value 的类,如果是Data,则直接附加它,如果是字符串,则将其转换为data(using:),等等。 哦..好的。 @Larme 如果你不介意,你能把它放在代码里吗……? if let v = value as? Data multipartFormData.append(v, withName: key) else //It's a String, at least we hope so, do as you already did) 只需从您的参数数据中删除此"product_image": imageData。由于在多部分中可用,因此您不需要它。 好的..我会试试的... 【参考方案1】:

您将 parameters 字典中的所有值转换为 String 的值,字典中的第一个条目是 "product_image",它的值是 imageData,它的类型是 Data

我会这样做,不再强制施放。

for (key, value) in parameters 
    if let v = value as? String, let valueAsData = v.data(using: .utf8) 
        multipartFormData.append(valueAsData, withName: key )
    

您还可以检查 value 是否已经是 Data 类型并添加它:

for (key, value) in parameters 
    var dataToAppend: Data?
    if let data = value as? Data 
        dataToAppend = data
     else if let v = value as? String, let valueAsData = v.data(using: .utf8) 
        dataToAppend = valueAsData
    

    if let d = dataToAppend 
        multipartFormData.append(d, withName: key )
    

【讨论】:

好的@Ladislav。但这会处理字符串参数还是只处理数据..? 第二种方法将附加所有五个键和值:“product_image”、“seller_id”、“offline_id”、“is_default”、“sequence”。 但是在这一行if let d = dataToAppen...我得到了错误Constant 'dataToAppend' used before being initialized 我的错,更新了代码,dataToAppend 必须是 var not let 没有@Ladislav。仅在此工作..仍然没有工作...:(

以上是关于使用 Alamofire 上传图片时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

alamofire上传带json参数的图片

如何在 alamofire 中同步上传图片?

使用 Alamofire 上传图像的问题(将图像作为参数)

如何使用 Alamofire.upload 函数上传带有一些参数的图片或 wav 文件

如何使用 Alamofire (post) 上传图片?

如何在swift中使用alamofire上传图库图片