Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSURLSession多部分/表单数据post请求出现问题_Ios_Swift_Http_Multipartform Data_Nsurlsession - Fatal编程技术网

Ios NSURLSession多部分/表单数据post请求出现问题

Ios NSURLSession多部分/表单数据post请求出现问题,ios,swift,http,multipartform-data,nsurlsession,Ios,Swift,Http,Multipartform Data,Nsurlsession,我在向我的服务器发送同一post请求中的文本和图像时遇到一些问题。我认为问题与我设定边界的方式有关 我正在使用swift和ios9 我遵照这里的指示 尽我所能将obj-c转换为swift 但是,当我向服务器发布请求时,每当我尝试访问post数据(如$_post[“key”])时,都会出现未定义的索引错误。下面是我用来设置http请求的代码,有人能发现错误吗: func sendRegisterRequest(params:Dictionary<String, String>, wi

我在向我的服务器发送同一post请求中的文本和图像时遇到一些问题。我认为问题与我设定边界的方式有关

我正在使用swift和ios9

我遵照这里的指示 尽我所能将obj-c转换为swift

但是,当我向服务器发布请求时,每当我尝试访问post数据(如$_post[“key”])时,都会出现未定义的索引错误。下面是我用来设置http请求的代码,有人能发现错误吗:

 func sendRegisterRequest(params:Dictionary<String, String>, withImage image: UIImage) {

    // https://stackoverflow.com/questions/8564833/ios-upload-image-and-text-using-http-post
    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;
func sendRegisterRequest(参数:字典,带图像:UIImage){
// https://stackoverflow.com/questions/8564833/ios-upload-image-and-text-using-http-post
让url=NSURL(字符串:“我的url”);
let request=NSMutableURLRequest(URL:URL!)
//边界字符串:一个随机字符串,不会在post数据中重复,用于分隔post数据字段。
让boundaryConstant=“------------V2ymHFg03ehbqgZCaKO6jy-->”;
//post参数“file”的字符串常量。我的服务器使用此名称:“file”。您的名称可能不同
让fileParamConstant=“file”;
request.HTTPMethod=“POST”
request.setValue(“多部分/表单数据;边界=\(边界常数)”,forHTTPHeaderField:“内容类型”)
//柱体
让body=NSMutableData();
//添加参数(所有参数都是字符串)
用于参数中的(键、值){
body.appendData(“\(boundaryConstant)\r\n”.dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData(“内容处置:表单数据;名称=\”\(key.stringByAddingPercentEncodingWithAllowedCharacters(.symbolCharacterSet())!)\“\r\n\r\n.dataUsingEncoding(NSUTF8StringEncoding)!”;
body.appendData(\(value.stringByAddingPercentEncodingWithAllowedCharacters(.symbolCharacterSet())!)\r\n.dataUsingEncoding(NSUTF8StringEncoding);
}
//印刷品(正文);
//添加图像数据
设imageData=UIImageJPEG表示(图像,1.0);
body.appendData(“\(boundaryConstant)\r\n”.dataUsingEncoding(NSUTF8StringEncoding)!);
body.appendData(“内容配置:表单数据;名称=\”\(fileParamConstant)\“文件名=\“图像\”\r\n”。数据使用编码(NSUTF8StringEncoding)!);
body.appendData(“内容类型: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--

另请参见

您可以检查此答案。谢谢,我已更正此问题,现在它可以正常工作。我还必须通过添加PercentEncoding with AllowedCharacters(.symbolCharacterSet())来删除
字符串。