使用 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", imageData
,value
已经是一个数据对象。不需要把它转换成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 上传图片时崩溃的主要内容,如果未能解决你的问题,请参考以下文章