【问题标题】:How do I correctly post a file from an iPhone to a node.js server that is using node-formidable?如何正确地将文件从 iPhone 发布到使用 node-formidable 的 node.js 服务器?
【发布时间】:2011-08-06 18:41:58
【问题描述】:

更新:此问题已于 2011 年 5 月 16 日在 phonegap github 存储库中修复。


我有以下 Objective-C 代码:

NSData *photoData = [NSData dataWithContentsOfFile:photoPath];

NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"photo-file\"; filename=\"%@\"\r\n", " my-photo.jpg"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:photoData];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];

[request addValue:[NSString stringWithFormat:@"%d", body.length] forHTTPHeaderField: @"Content-Length"];

[[NSURLConnection alloc] initWithRequest:request delegate:appDelegate];

[photoData release];
[body release];
[request release];

我正在尝试将图像从 iPhone 发布到使用 node-formidable 的 node.js 服务器。服务器已经可以很好地处理从浏览器发布的图像,但是当我尝试从我的 iPhone 发布时,我收到以下错误:

错误:MultipartParser.end():流 意外结束于 MultipartParser.end (/formidable/1.0.0/package/lib/formidable/multipart_parser.js:301:12) 在 IncomingMessage.anonymous (强大/1.0.0/package/lib/formidable/incoming_form.js:80:30) 在 IncomingMessage.emit (events.js:61:17) 在 HTTPParser.onMessageComplete (http.js:132:23) 在 Socket.ondata (http.js:1001:22) 在 Socket._onReadable (net.js:677:27) 在 IOWatcher.onReadable 作为回调 (net.js:177:10)

图像已正确保存在服务器的临时文件夹中,但在尝试解析表单时会引发错误

【问题讨论】:

    标签: iphone objective-c ios node.js http-headers


    【解决方案1】:

    显然,强大的边界是相当挑剔的。试试这个:

     NSMutableData* body = [NSMutableData data];    
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"image\"; filename=\"%@\"\r\n", imageName] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n", @"image/jpeg"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:data];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [urlRequest setHTTPBody:body];
    

    【讨论】:

    • 谢谢,有人刚刚将该补丁提交到 phonegap 存储库。
    【解决方案2】:

    我不知道到底是什么问题。我建议您安装一个工具,当您从浏览器和您的应用程序上传图像时,该工具可以向您显示这两个请求之间的区别。最著名的工具是http://www.wireshark.org/。 或者一些非免费的工具,比如httpscoop(http://www.tuffcode.com/download.html,14天试用)。我个人都很喜欢他们两个。

    找到差异后,您可以调整您的应用代码,使其发送完全相同的请求,这将解决您的问题。

    【讨论】:

    • 谢谢,我注意到 Wireshark 说我发送了一个格式错误的 HTTP 数据包,所以我现在使用 ASIHTTPRequest 并且它工作正常。
    【解决方案3】:

    [request release];

    我猜你在它发送所有数据之前清理了请求对象。这可以解释意外的流退出。

    【讨论】:

    • 我忘记在我的原始帖子中提到图像已正确保存在服务器的临时文件夹中,但它是节点强大的,在尝试解析表单时会引发错误。
    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 2020-09-17
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多