我试图将图像从Swift应用程序上传到基于PHP的服务器。我收集了一些相关的代码并尝试使用它,但上传不成功。以下是使用我所做的附加请求正文上传图像的功能,以及我得到的响应。
注意:服务器正在运行,我尝试使用 RestClient应用 进行测试。它接受multipart/form-data
并接受正文中的所有请求。
上传功能
func imageUploadRequest(){
let parameters = [
"activity1": selectedActivity+1,
"activity2": selectedActivity2+1,
"activity3": selectedActivity3+1,
"activity_id": selectedActID
]
let boundary = generateBoundaryString()
let url = NSURL(string: "http://myServerURL/uploadImage")
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let newImageData = UIImageJPEGRepresentation(self.imageView.image, 1)
let newImage2Data = UIImageJPEGRepresentation(self.imageView2.image, 1)
let newImage3Data = UIImageJPEGRepresentation(self.imageView3.image, 1)
request.HTTPBody = createBodyWithParameters(parameters, imageDataKey: ["image1": newImageData, "image2": newImage2Data, "image3": newImage3Data], boundary: boundary)
.
.
.
}
CreateBodyWithParameters功能
func createBodyWithParameters(parameters: [String: Int]?, imageDataKey: [String: NSData]?, boundary: String) -> NSData {
var body = NSMutableData();
if parameters != nil {
for (key, value) in parameters! {
body.appendString("–\(boundary)\r\n")
body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
body.appendString("\(value)\r\n")
}
}
if imageDataKey != nil {
for (key, value) in imageDataKey! {
let filename = "user-profile.jpg"
let mimetype = "image/jpg"
body.appendString("--\(boundary)\r\n")
body.appendString("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(filename)\"\r\n")
body.appendString("Content-Type: \(mimetype)\r\n\r\n")
body.appendData(value)
body.appendString("\r\n")
}
}
body.appendString("\r\n-–\(boundary)-–\r\n")
return body
}
我收到的回复:
<NSHTTPURLResponse: 0x170439cc0> { URL: http://myServerURL/uploadImage } { status code: 500, headers {
"Cache-Control" = "no-cache";
Connection = close;
"Content-Type" = "text/html";
Date = "Thu, 04 Jun 2015 01:52:46 GMT";
Server = Apache;
"Set-Cookie" = "laravel_session=eyJpdiI6IjlyaWRKMjdBbTZiWWluSGk3QU9lcXc9PSIsInZhbHVlIjoiWlwvOHdtcURjOHlSTWR3MmtYNm0rbHlEaWJKSTMrZk1hWkVvSHpzTVdrcE5SQTl2bFkxemlJYUNLYkZMZjJxdEFCMFwvWENlMzFReW9GU3Jkam5XSmxvZz09IiwibWFjIjoiYWJmYWU2MDU2MGRkNzM1MjcyNWM1YjFjMDJjZjA5MmNjNjA4MzA3ZGE5MWMzNmJiZmE3ZTg3Y2I2OWI4N2E4NiJ9; expires=Thu, 04-Jun-2015 03:52:48 GMT; Max-Age=7200; path=/; httponly";
} }
答案 0 :(得分:0)
最终,您必须检查服务器是否存在500错误。如果你怀疑它的多部分,我注意到你的第一个边界有一个破折号,应该有两个:
body.appendString("-–\(boundary)\r\n")
此外,不确定这是否是一个问题,但如果您有多个图像,请尝试使用其他边界值。请参阅最后一个示例here。
在我看来,构建多部分表单是一件痛苦的事。如果我是你,我会使用像Alamofire或AFNetworking这样的连接库。