NSURLSession multipart/form-data post 请求有问题
Trouble with NSURLSession multipart/form-data post request
我在向我的服务器发送同一 post 请求中的文本和图像时遇到了一些问题。我认为问题与我设定界限的方式有关。
我正在使用 swift 和 ios9。
我按照此处的说明进行操作
尽力将 obj-c 转换为 swift
然而,当我 post 向我的服务器发出请求时,每当我尝试访问 post 数据(例如 $_POST["key"] 时,我都会收到未定义的索引错误。这是我用来设置 http 请求的代码,任何人都可以发现错误:
func sendRegisterRequest(params:Dictionary<String, String>, withImage image: UIImage) {
//
let url = NSURL(string: "MY_URL");
let request = NSMutableURLRequest(URL: url!)
// the boundary string : a random string, that will not repeat in post data, to separate post data fields.
let boundaryConstant = "----------V2ymHFg03ehbqgZCaKO6jy--";
// string constant for the post parameter 'file'. My server uses this name: `file`. Your's may differ
let fileParamConstant = "file";
request.HTTPMethod = "POST"
request.setValue("multipart/form-data; boundary=\(boundaryConstant)", forHTTPHeaderField: "Content-Type")
// post body
let body = NSMutableData();
// add params (all params are strings)
for (key, value) in params {
body.appendData("\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData("Content-Disposition: form-data; name=\"\(key.stringByAddingPercentEncodingWithAllowedCharacters(.symbolCharacterSet())!)\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData("\(value.stringByAddingPercentEncodingWithAllowedCharacters(.symbolCharacterSet())!)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
}
//print(body);
// add image data
let imageData = UIImageJPEGRepresentation(image, 1.0);
body.appendData("\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData("Content-Disposition: form-data; name=\"\(fileParamConstant)\"; filename=\"image\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData("Content-Type: image/jpeg\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData(imageData!);
body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData("\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
request.HTTPBody = body;
当您使用多部分表单数据时,您必须在正文数据中额外添加两个连字符作为边界的前缀,并且还必须在最终边界的末尾添加两个连字符。所以如果你有:
boundary=foo
那么正文应该是这样的:
--foo
field 1 info
--foo
field 2 info
--foo--
另见 What is the '-' in multipart/form-data?
我在向我的服务器发送同一 post 请求中的文本和图像时遇到了一些问题。我认为问题与我设定界限的方式有关。
我正在使用 swift 和 ios9。
我按照此处的说明进行操作 尽力将 obj-c 转换为 swift
然而,当我 post 向我的服务器发出请求时,每当我尝试访问 post 数据(例如 $_POST["key"] 时,我都会收到未定义的索引错误。这是我用来设置 http 请求的代码,任何人都可以发现错误:
func sendRegisterRequest(params:Dictionary<String, String>, withImage image: UIImage) {
//
let url = NSURL(string: "MY_URL");
let request = NSMutableURLRequest(URL: url!)
// the boundary string : a random string, that will not repeat in post data, to separate post data fields.
let boundaryConstant = "----------V2ymHFg03ehbqgZCaKO6jy--";
// string constant for the post parameter 'file'. My server uses this name: `file`. Your's may differ
let fileParamConstant = "file";
request.HTTPMethod = "POST"
request.setValue("multipart/form-data; boundary=\(boundaryConstant)", forHTTPHeaderField: "Content-Type")
// post body
let body = NSMutableData();
// add params (all params are strings)
for (key, value) in params {
body.appendData("\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData("Content-Disposition: form-data; name=\"\(key.stringByAddingPercentEncodingWithAllowedCharacters(.symbolCharacterSet())!)\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData("\(value.stringByAddingPercentEncodingWithAllowedCharacters(.symbolCharacterSet())!)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
}
//print(body);
// add image data
let imageData = UIImageJPEGRepresentation(image, 1.0);
body.appendData("\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData("Content-Disposition: form-data; name=\"\(fileParamConstant)\"; filename=\"image\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData("Content-Type: image/jpeg\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData(imageData!);
body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData("\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!);
request.HTTPBody = body;
当您使用多部分表单数据时,您必须在正文数据中额外添加两个连字符作为边界的前缀,并且还必须在最终边界的末尾添加两个连字符。所以如果你有:
boundary=foo
那么正文应该是这样的:
--foo
field 1 info
--foo
field 2 info
--foo--
另见 What is the '-' in multipart/form-data?