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

使用Swift将图像上载到服务器时出错,swift,post,upload,server,multipartform-data,Swift,Post,Upload,Server,Multipartform Data,嗨,这是我用来通过链接上传图片到服务器的代码 if (currentElementName == "uploadUrl") { let returnUploadURL = string var imageData = UIImagePNGRepresentation(pictureImage.image) if imageData != nil{ var r

嗨,这是我用来通过链接上传图片到服务器的代码

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

看起来您正在传递一个不存在的地址(
URL:http://oms/process.php?method=PQUEUE_INV_FILE
)到
发送同步请求

sendSynchronousRequest
如果无法创建连接,则返回
nil

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

var returnString=NSString(数据:returnData!,编码:NSUTF8StringEncoding)

这会导致错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

您需要了解的是为什么
returnUploadURL
设置为
URL:http://oms/process.php?method=PQUEUE_INV_FILE
。我猜这一部分发生在代码的前面。

一些观察结果:

  • 在图像名称的
    内容配置
    中,您的
    \\r
    显然是指
    \r

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

  • 关于失败的请求,这似乎是第二次调用,但第二次
    返回上载URL
    不正确(它看起来只是
    &
    )。你没有向我们展示你是如何建立这个URL的,但似乎有一个问题。检查构建该URL的代码

    如果您在开始构建请求之前对URL进行了
    println
    ,应该可以彻底解决这个问题。您建议URL应为:

    http://oms/process.php?method=PQUEUE_INV_FILE&id=22405
    
    但是,不知何故,似乎有两个独立的请求正在生成。您的第一个请求似乎是在
    &
    之前切断URL。第二个似乎是
    &
    本身。底线是,您尚未共享构建URL的代码,但我怀疑其中存在一些问题


  • @JeromeL,在我写的代码下面。从“顺便说一句,当你得到这个紧随其后的问题时,你可能会考虑退出这个同步请求,而非异步请求。此外,考虑到建立多部分请求的问题,您可能会考虑使用一些类似于AfnFixor或ALAMOFE的东西,而不是自己建立请求。谢谢Rob,我会考虑的。您知道为什么Xcode决定在“&”符号后的链接出现问题吗?即使是控制台也会以一个新行的形式返回它,而不是实际的链接。这很难说。您还没有向我们展示构建分配给
    returnUploadURL
    字符串的代码。我怀疑传递给请求的错误URL就在那里,而不是在上面的代码中。下面您建议您正在解析SOAP响应。您的解析代码可能有问题(例如,在
    foundCharacters
    中创建请求,而不是在
    didEndElement
    中创建请求)。很难说没有看到相关的部分。@Rob-Hmm我希望我能告诉你一些方法,因为这很难弄清楚。我看到了,我注意到URL的第一部分保持不变(oms/process.php?method=PQUEUE\u INV\u文件),并解析SOAP响应以获取id,然后就这么做了”)“但我希望我不必硬编码链接。
    http://oms/process.php?method=PQUEUE_INV_FILE&id=22405