使用Swift中的参数将图像发送到服务器
问题描述:
我正在尝试使用Alamofire在服务器上使用json
参数发送图像。但在服务器上,他们能够接收图像,但不是我正在发送的Json
。下面是我使用的代码:使用Swift中的参数将图像发送到服务器
let parameters: [String : String] = [
"preferredVenueType": "club",
"userId": "1"
]
let urlRequest = urlRequestWithComponents(baseURL + uploadImage, parameters: parameters , imageData: imageData!)
upload(urlRequest.0, data: urlRequest.1)
.progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
//print("\(totalBytesWritten)/\(totalBytesExpectedToWrite)")
}
.responseJSON {response in
if let JSON = response.result.value {
print("JSON: \(JSON)")
}
func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData) -> (URLRequestConvertible, NSData) {
// create url request to send
let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
mutableURLRequest.HTTPMethod = Method.POST.rawValue
let boundaryConstant = "myRandomBoundary12345";
let contentType = "multipart/form-data;boundary="+boundaryConstant
mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")
// mutableURLRequest.HTTPBody = jsonData
// create upload data to send
let uploadData = NSMutableData()
// add image
uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Disposition: form-data; name=\"profileImage\"; filename=\"profileImage.png\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData(imageData)
// add parameters
for (key, value) in parameters {
uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
// uploadData.appendData("Content-Disposition: form-data; name=\"json\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
}
uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
// return URLRequestConvertible and NSData
return (ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
}
我在响应收到错误消息,因为它们无法与图像文件一起收到JSON
数据。
答
我解决了我的问题,发送参数为JSON String
而不是键值对。
let parameters: [String : String] = [
"preferredVenueType": prameterText,
"userId": userId,
]
var theJSONText : NSString = ""
do {
let theJSONData = try NSJSONSerialization.dataWithJSONObject(
parameters ,
options: NSJSONWritingOptions(rawValue: 0))
theJSONText = NSString(data: theJSONData,
encoding: NSASCIIStringEncoding)!
// due to some reason NSUTF8StringEncoding was not working so i used ASCII encoding
} catch let error as NSError {
print(error)
}
虽然它发送给服务器我用
let uploadData = NSMutableData()
uploadData.appendData("--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("Content-Disposition: form-data; name=\"json\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
uploadData.appendData("\(theJSONText)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
发送参数作为JSON String
所述数据被成功地上传到服务器之后。
答
嗨,我没有关于swift的知识。但根据你的问题,服务器接收图像意味着url是正确的。所以
1)首先检查你发送的数据。可能是您发送错误的数据类型。 例如:服务器端{dictionary [dictionary]},发送{字典}这样。
2)检查标题字段。
3)检查标题字段对象和键名(大写或小写)每一个字母。
4)最后在您的项目.plist文件中添加下面的代码。添加到项目中的每个plist。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
添加此,右键单击的.plist,然后打开它的源code.copy上面的纹路和以往在年底前"</dict></plist>"
线。
只是试试这个..我不确定这个,它会有用的。
你检查过了吗?[alamo fire multipart upload](https://github.com/Alamofire/Alamofire#user-content-uploading-multipartformdata)? –
@the_UB我检查了这一点,但仍然无法正常工作... – Shruti