使用NSURLConnection从iPhone进行HTTPS POST会挂起某些文件大小范围

时间:2010-12-08 06:45:03

标签: iphone post ssl nsurlconnection nsurlrequest

我正在使用NSURLConnection对我们的web服务进行异步HTTPS POST以上传jpg。它大部分时间都可以正常工作。

但是当帖子正文在196609和196868字节(包括)之间时,连接在文件上传100%后挂起(didSendBodyData告诉我它是100%发送的)。 5分钟后,连接超时,显示“网络连接丢失”。更大和更小的文件大小工作。我已经通过限制我添加到帖子正文的文件的文件大小来测试它。

正确设置内容长度。请参阅下面的代码。

当我通过HTTP上传到netcat时上传看起来很好。消息的整个部分都可以通过。但我怀疑因为SSL加密而出现了问题,就像它正在缓冲SSL加密的块帧一样。

iPhone的SSL代码中是否存在错误,使其无法上传整个帖子正文,即使它正在报告它或其他内容?

这是我设置内容长度并将文件附加到多部分POST主体的部分。您可以看到我手动限制文件大小以进行测试。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:nsurl];
[request setHTTPMethod:@"POST"];
[request setTimeoutInterval:1];
[request addValue:@"close" forHTTPHeaderField: @"Connection"];

// Add headers and POST information
NSLog( @"Posting file." );
NSString *stringBoundary = [NSString stringWithString:@"0xKhTmLbOuNdArY"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *postBody = [NSMutableData data];

...

[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"uploadFile\"; filename=\"upload.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Type: image/jpg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
NSLog( @"file size...%d", [uploadFile length] );
//[postBody appendData:uploadFile];
[postBody appendData:[NSData dataWithBytes: [uploadFile bytes] length: 196099]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postBody];
[request setValue:[NSString stringWithFormat:@"%d", [postBody length]] forHTTPHeaderField:@"Content-Length"];
NSLog(@"Uploaded POST size: %d", [postBody length] );

3 个答案:

答案 0 :(得分:3)

啊,我发现了问题所在。连接:正在设置保持活动,即使我设置连接:关闭。我该如何覆盖?看起来你不能!?

答案 1 :(得分:1)

我有以下代码,测试30-40 MB的文件,它永远不会挂起。它看起来几乎与您的代码类似,但是您确定它不是您的服务器端脚本可能正在等待某些东西吗?

url = [NSURL URLWithString:u];

NSData* d = [self data];

request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval: 2000 ];
[request setHTTPMethod:@"POST"];
[request setValue:
 [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BOUNDRY]
forHTTPHeaderField:@"Content-Type"];

NSMutableData *postData =
[NSMutableData dataWithCapacity:[d length] + 512];
[postData appendData:
 [[NSString stringWithFormat:@"--%@\r\n", BOUNDRY] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:
 [[NSString stringWithFormat:
   @"Content-Disposition: form-data; name=\"%@\"; filename=\"file.bin\"\r\n\r\n", FORM_FLE_INPUT]
  dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:d];
[postData appendData:
 [[NSString stringWithFormat:@"\r\n--%@--\r\n", BOUNDRY] dataUsingEncoding:NSUTF8StringEncoding]];

[request setHTTPBody:postData];

答案 2 :(得分:1)

我认为你可以尝试删除这行代码。

[request addValue:@"close" forHTTPHeaderField: @"Connection"];

它会告诉http服务器关闭此连接。通过RFC 2616(HTTP / 1.1),服务器和客户端应该保持持久连接。