使用 Swift 将图像上传到服务器时出错
Error while uploading image to server with Swift
您好,这是我用来通过 link 将图像上传到我们服务器的代码。
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" 的?为什么我会在 link 中的“&”之后收到这个致命错误? link 以这种方式工作。
"http://oms/process.php?method=PQUEUE_INV_FILE&id=22405"
您似乎正在将一个不存在的地址 (URL: http://oms/process.php?method=PQUEUE_INV_FILE
) 传递给 sendSynchronousRequest
。
sendSynchronousRequest
returns 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
。我想这部分发生在您的代码中。
一些观察:
在您的 content-disposition
图像名称中,您有 \r
显然是指 \r
。
您的请求未正确终止。您应该在最后一个边界之后但在 \r\n
之前有一个 --
(例如,最后一个边界的格式字符串应该是 \r\n--%@--\r\n
)。
关于您失败的请求,这似乎是第二次调用,但第二次 returnUploadURL
不正确(看起来只是 &
).您没有向我们展示您是如何构建 URL 的,但似乎那里存在问题。检查正在构建 URL.
的代码
如果您在开始构建请求之前执行 URL 的 println
,应该可以显着解决该问题。您建议 URL 应该是:
http://oms/process.php?method=PQUEUE_INV_FILE&id=22405
但是,不知何故,似乎正在构建两个单独的请求。您的第一个请求似乎是在 &
之前切断 URL。第二个似乎是 &
本身。总之,您没有共享构建 URL 的代码,但我怀疑那里存在一些问题。
您好,这是我用来通过 link 将图像上传到我们服务器的代码。
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" 的?为什么我会在 link 中的“&”之后收到这个致命错误? link 以这种方式工作。
"http://oms/process.php?method=PQUEUE_INV_FILE&id=22405"
您似乎正在将一个不存在的地址 (URL: http://oms/process.php?method=PQUEUE_INV_FILE
) 传递给 sendSynchronousRequest
。
sendSynchronousRequest
returns 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
。我想这部分发生在您的代码中。
一些观察:
在您的
content-disposition
图像名称中,您有\r
显然是指\r
。您的请求未正确终止。您应该在最后一个边界之后但在
\r\n
之前有一个--
(例如,最后一个边界的格式字符串应该是\r\n--%@--\r\n
)。关于您失败的请求,这似乎是第二次调用,但第二次
的代码returnUploadURL
不正确(看起来只是&
).您没有向我们展示您是如何构建 URL 的,但似乎那里存在问题。检查正在构建 URL.如果您在开始构建请求之前执行 URL 的
println
,应该可以显着解决该问题。您建议 URL 应该是:http://oms/process.php?method=PQUEUE_INV_FILE&id=22405
但是,不知何故,似乎正在构建两个单独的请求。您的第一个请求似乎是在
&
之前切断 URL。第二个似乎是&
本身。总之,您没有共享构建 URL 的代码,但我怀疑那里存在一些问题。