NSURLConnection http PUT 与 HTTP_RANGE 不起作用

发布于 2024-10-11 09:43:09 字数 3280 浏览 7 评论 0原文

我正在尝试从 iphone 将图像分块上传到服务器,我在服务器端有 PHP 代码,它读取数据并使用 HTTP_RANGE 附加到现有图像。

注意:服务器端代码已经过测试,并且使用浏览器中的 html 运行良好。

我的服务器端代码仅将 POST 作为 httpMethod,因此我必须在帖子正文中给出restMethod = PUT 和 HTTP_RANGE,如下所示:-

[bodyData appendData:[[NSString stringWithFormat:@"\r\n\r\n--%@\r\n", kHttpPostMimeBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"restMethod\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithString:@"PUT"] dataUsingEncoding:NSUTF8StringEncoding]]; 

[bodyData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", kHttpPostMimeBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"HTTP_RANGE\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithFormat:@"%d-0",offset] dataUsingEncoding:NSUTF8StringEncoding]];  

上传的图像为 0KB。我还尝试仅使用restMethod = PUT和HTTP_RANGE=0-0以一大块发送文件,它仍然是0KB,但如果我只执行restMethod = PUT并省略HTTP_RANGE,则图像上传成功。

我真的很困惑这里,请帮忙!!

编辑::添加实际的HTTP请求:-

NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url];

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

[req addValue:contentType forHTTPHeaderField:@"Content-Type"];      

[req addValue:msgLength forHTTPHeaderField:@"Content-Length"];

[req setHTTPMethod:@"POST"];

NSMutableData *bodyData = [NSMutableData data];

[bodyData appendData:[[NSString stringWithFormat:@"\r\n\r\n--%@\r\n", kHttpPostMimeBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"restMethod\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithString:@"PUT"] dataUsingEncoding:NSUTF8StringEncoding]];  

if (offset > 0) {
    [bodyData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", kHttpPostMimeBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [bodyData appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"HTTP_RANGE\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [bodyData appendData:[[NSString stringWithFormat:@"%d-0",offset] dataUsingEncoding:NSUTF8StringEncoding]];  

}
[bodyData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", kHttpPostMimeBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"\r\n",fileName] dataUsingEncoding:NSUTF8StringEncoding]];

[bodyData appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n",mimeType]
                      dataUsingEncoding:NSUTF8StringEncoding]];

[bodyData appendData:fileData];

[bodyData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",kHttpPostMimeBoundary]
                      dataUsingEncoding:NSUTF8StringEncoding]];

NSString *msgLength = [NSString stringWithFormat:@"%d", [bodyData length]];
[headerParamDict setValue:msgLength forKey:@"Content-Length"];

[req setHTTPBody: bodyData];

I am trying to upload an image in chunks to the server from iphone, I have PHP code on the server side which reads the data and appends using HTTP_RANGE to an existing image.

Note : server side code is tested and running fine using html from browser.

My server side code only take POST as httpMethod, so I have to give restMethod = PUT and HTTP_RANGE in the body of the post, like this :-

[bodyData appendData:[[NSString stringWithFormat:@"\r\n\r\n--%@\r\n", kHttpPostMimeBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"restMethod\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithString:@"PUT"] dataUsingEncoding:NSUTF8StringEncoding]]; 

[bodyData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", kHttpPostMimeBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"HTTP_RANGE\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithFormat:@"%d-0",offset] dataUsingEncoding:NSUTF8StringEncoding]];  

The uploaded image is 0KB. I have also tried sending the file in one chunk only with restMethod = PUT and HTTP_RANGE=0-0, it still is 0KB, but if I only do restMethod = PUT and omit out HTTP_RANGE the image is uploaded successfully.

I am really stumped here, please help !!

EDIT :: Adding the actual HTTP Request :-

NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url];

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

[req addValue:contentType forHTTPHeaderField:@"Content-Type"];      

[req addValue:msgLength forHTTPHeaderField:@"Content-Length"];

[req setHTTPMethod:@"POST"];

NSMutableData *bodyData = [NSMutableData data];

[bodyData appendData:[[NSString stringWithFormat:@"\r\n\r\n--%@\r\n", kHttpPostMimeBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"restMethod\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithString:@"PUT"] dataUsingEncoding:NSUTF8StringEncoding]];  

if (offset > 0) {
    [bodyData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", kHttpPostMimeBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [bodyData appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"HTTP_RANGE\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [bodyData appendData:[[NSString stringWithFormat:@"%d-0",offset] dataUsingEncoding:NSUTF8StringEncoding]];  

}
[bodyData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", kHttpPostMimeBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[bodyData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"\r\n",fileName] dataUsingEncoding:NSUTF8StringEncoding]];

[bodyData appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n",mimeType]
                      dataUsingEncoding:NSUTF8StringEncoding]];

[bodyData appendData:fileData];

[bodyData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",kHttpPostMimeBoundary]
                      dataUsingEncoding:NSUTF8StringEncoding]];

NSString *msgLength = [NSString stringWithFormat:@"%d", [bodyData length]];
[headerParamDict setValue:msgLength forKey:@"Content-Length"];

[req setHTTPBody: bodyData];

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文