使用请求正文上传批量图像

时间:2015-06-04 02:16:28

标签: ios swift image-uploading multipartform-data

我试图将图像从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";
} }

1 个答案:

答案 0 :(得分:0)

最终,您必须检查服务器是否存在500错误。如果你怀疑它的多部分,我注意到你的第一个边界有一个破折号,应该有两个:

body.appendString("-–\(boundary)\r\n")

此外,不确定这是否是一个问题,但如果您有多个图像,请尝试使用其他边界值。请参阅最后一个示例here

在我看来,构建多部分表单是一件痛苦的事。如果我是你,我会使用像Alamofire或AFNetworking这样的连接库。