【问题标题】:Error while uploading image to server with Swift使用 Swift 将图像上传到服务器时出错
【发布时间】:2015-02-27 20:55:31
【问题描述】:

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

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”的?为什么在链接中的“&”之后会出现这个致命错误?该链接以这种方式工作。

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

【问题讨论】:

  • @JeromeL 在我写的代码下面。以“ 开头
  • 顺便说一句,当您遇到这个直接的问题时,您可能会考虑放弃此同步请求以支持异步请求。此外,考虑到构建多部分请求的问题,您可能会考虑使用 AFNetworking 或 Alamofire 之类的东西,而不是自己构建请求。
  • 谢谢@Rob,我会考虑的。你知道为什么 Xcode 决定在“&”符号后面的链接有问题吗?甚至控制台也会从实际链接中以新行返回它。
  • 很难说。您尚未向我们展示构建您分配给returnUploadURLstring 的代码。我怀疑传递给请求的错误 URL 在那里,而不是在上面的代码中。您在下面建议您正在解析 SOAP 响应。也许您的解析代码有问题(例如,在foundCharacters 而不是didEndElement 中创建请求)。很难说没有看到相关的位。
  • @Rob 嗯,我希望我能告诉你一些方法,因为这很难弄清楚。

标签: swift post upload server multipartform-data


【解决方案1】:

几个观察:

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

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

  3. 关于您失败的请求,这似乎是第二次调用,但第二个returnUploadURL 不正确(它似乎只是&amp;)。您没有向我们展示您是如何构建该 URL 的,但那里似乎存在问题。检查构建该 URL 的代码。

    如果您在开始构建请求之前对 URL 执行println,则应该可以明显缓解该问题。您建议的 URL 应该是:

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

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

【讨论】:

  • 我看到了,我注意到 URL 的第一部分保持不变 (oms/process.php?method=PQUEUE_INV_FILE) 并解析 SOAP 响应以获取 id 并只是做了“@987654321 @)" 但我希望我不必对链接进行硬编码。
【解决方案2】:

您似乎将一个不存在的地址 (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。我猜这部分发生在你的代码的前面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2017-04-23
    • 1970-01-01
    • 2018-01-19
    • 2016-06-07
    • 1970-01-01
    相关资源
    最近更新 更多