NSMutableURLRequest偶尔出现“无边界”错误

时间:2011-01-10 15:20:25

标签: iphone objective-c ios nsmutableurlrequest boundary

我正在使用NSMutableURLRequest将图像上传到Web服务器。我认为我的代码是稳定的,因为它适用于大多数用户,但有些用户根本无法上传任何图像。查看我的服务器日志,我偶尔会看到

“在第0行的未知中的多部分/表格数据POST数据中缺少边界”警告,这将指出构建帖体时的边界错误。

以下是我正在使用的内容:

request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:[method uppercaseString]];

NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data, boundary=%@", boundary];

[request setValue:contentType forHTTPHeaderField:@"Content-type"];
NSMutableData *postBody = [NSMutableData data];

// add the image
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[@"Content-Disposition: form-data; name=\"image_upload\"; filename=\"upload.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
NSData *jpegData = UIImageJPEGRepresentation(jpeg, 100);
[postBody appendData:jpegData];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// add the other POST params
keys = [postdata allKeys];
int l = [keys count];
for (int i=0; i<l; i++){
    [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", [keys objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[postdata objectForKey:[keys objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    }

我可以理解代码是否在100%的时间内导致了PHP警告,但是每30或40个用户可能会发生一次。如果用户收到此错误,则对于他们尝试发布的任何图片都是相同的。

任何人都可以立即看到任何明显的信息,或者对于为什么会出现间歇性问题有任何见解?

2 个答案:

答案 0 :(得分:1)

HTTP标头字段不区分大小写,因此无论您使用Content-TypeContent-type还是CONTENT-TYPE,都不应有任何区别。此外,您的答案并不能解释为什么只有少数用户遇到此问题。

我对缺失的边界有不同的解释,一个基于实际经验。事实证明,一些蜂窝数据提供商,特别是Vodafone,通过添加各种自定义标头(例如x-up-subnoHTTP_SM_MS_CRYPTED等)的代理来过滤所有HTTP请求。我有现实证据表明,其中一些代理以multipart/form-data形式发布,删除Content-Type标题的“boundary”属性,从而使表单几乎不能用于任何服务器。

答案 1 :(得分:0)

原来问题在于这一行:

[request setValue:contentType forHTTPHeaderField:@"Content-type"];

当然应该是:

[request setValue:contentType forHTTPHeaderField:@"Content-Type"];

(注意案例)。但仍然不确定为什么这会打破只有少数用户的请求。