使用Swift将图像上传到服务器时出错

时间:2015-02-27 20:55:31

标签: swift post upload server multipartform-data

嗨,所以这里是我用来通过链接将图像上传到我们服务器的代码。

if (currentElementName == "uploadUrl") {
                let returnUploadURL = string

                var imageData = UIImagePNGRepresentation(pictureImage.image)

                if imageData != nil{
                    var request = NSMutableURLRequest(URL: NSURL(string: returnUploadURL)!)
                    var session = NSURLSession.sharedSession()
                    println(request)
                    request.HTTPMethod = "POST"

                    var boundary = NSString(format: "---------------------------14737809831466499882746641449")
                    var contentType = NSString(format: "multipart/form-data; boundary=%@",boundary)
                    //  println("Content Type \(contentType)")
                    request.addValue(contentType, forHTTPHeaderField: "Content-Type")

                    var body = NSMutableData.alloc()

                    // Title
                    body.appendData(NSString(format: "\r\n--%@\r\n",boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
                    body.appendData(NSString(format:"Content-Disposition: form-data; name=\"image.png\"\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
                    body.appendData("Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!)

                    // Image
                    body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
                    body.appendData(NSString(format:"Content-Disposition: form-data; name=\"file\"; filename=\"image.png\"\\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
                    body.appendData(NSString(format: "Content-Type: application/octet-stream\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
                    body.appendData(imageData)
                    body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)

                    request.HTTPBody = body

                    var returnData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)
                    var returnString = NSString(data: returnData!, encoding: NSUTF8StringEncoding)

                    println("returnString \(returnString)")
                }
            }

出于某种原因,我在控制台中得到了这个,应用程序崩溃了。

<NSMutableURLRequest: 0x17020d560> { URL: http://oms/process.php?method=PQUEUE_INV_FILE }
returnString Optional(Array
(
    [file] => Array
        (
            [name] => r
            [type] => application/octet-stream
            [tmp_name] => /tmp/phpbAfzYN
            [error] => 0
            [size] => 17263726
        )

)
)
<NSMutableURLRequest: 0x174018130> { URL: & }
fatal error: unexpectedly found nil while unwrapping an Optional value

首先,它如何赋予它文件名“r”?为什么我在“&amp;”之后得到这个致命错误在链接?链接以这种方式工作。

"http://oms/process.php?method=PQUEUE_INV_FILE&id=22405"

2 个答案:

答案 0 :(得分:0)

您似乎正在传递一个不存在(URL: http://oms/process.php?method=PQUEUE_INV_FILE)到sendSynchronousRequest的地址。

如果无法创建连接,

sendSynchronousRequest将返回nil

因此,returnData设置为nil,您试图在下一行打开它:

var returnString = NSString(data: returnData!, encoding: NSUTF8StringEncoding)

这会导致错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

您需要弄清楚的是returnUploadURL设置为URL: http://oms/process.php?method=PQUEUE_INV_FILE的原因。我想这部分会在您的代码中提前发生。

答案 1 :(得分:0)

有几点意见:

  1. 在图片名称的content-disposition中,您有\\r,显然您的意思是\r

  2. 您的请求未正确终止。您应该在最后一个边界之后但--之前有\r\n(例如,最后一个边界的格式字符串应为\r\n--%@--\r\n)。

  3. 关于您失败的请求,似乎是第二次调用,但第二次returnUploadURL不正确(它看起来只是&)。您没有告诉我们您是如何构建该URL的,但似乎存在问题。检查构建该URL的代码。

    如果在开始构建请求之前执行了println的URL,则应该可以轻松解决问题。您建议URL应为:

    http://oms/process.php?method=PQUEUE_INV_FILE&id=22405
    

    但是,不知何故,似乎有两个单独的请求正在建立。您的第一个请求似乎是在&之前切断了网址。第二个似乎是&本身。最重要的是,您尚未共享构建URL的代码,但我怀疑存在一些问题。