iOS 使用 Node.js 与 Multiparty 和 GraphicsMagick 将图像上传到 S3

iOS Image upload to S3 by using Node.js with Multiparty and GraphicsMagick

我们有一个网站正在使用 ng-file-upload 向后端发送上传图片的请求。它将图像转换成不同的大小并上传到 Amazon S3 服务器。它在网络上运行良好。我们的 front-end 和 back-end 包含 JS 代码。

我们可以从 iOS 应用程序上传文件到 AWS SDK for iOS,但是这需要太多时间,而且请求一直超时。

根据要求,使用常规方法将文件从iOS App上传到服务器(节点),然后转换为不同的大小( ng-file-upload - multiparty & GraphicsMagick) & 然后上传到 Amazon 服务器 (S3).

所以,我们使用传统方法将图片上传到后端服务器。

图片上传代码

NSMutableURLRequest *urlRequest = [NSMutableURLRequest
                                           requestWithURL:url
                                           cachePolicy:NSURLRequestUseProtocolCachePolicy
                                           timeoutInterval:DEFAULT_TIMEOUT];

[urlRequest setHTTPMethod:@"POST"];

NSString *boundary = @"---------------------------14737809831464368775746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[urlRequest addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSMutableData *body = [NSMutableData data];

//Image
if(imageData)
{
     [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", imgName, imgName] dataUsingEncoding:NSUTF8StringEncoding]];

     [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:imageData];
     [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}

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

[urlRequest setHTTPBody:body];

我们在 node.js 后端使用 multiparty。即使我们无法获取任何文件 object 来填充以进行进一步的步骤。它在后端抛出错误。

从应用程序上传时,请求 headers 中的文件详细信息在后端为空。所以,我们得到一个像 'path' undefined.

这样的错误

因此,我们没有将任何文件或图像发送到后端,因此无法进一步处理对话以及上传。我们卡在了这个地方。

我认为你必须遵循两个步骤 -

1- 请在服务器(节点)上验证一次脚本文件名必须与从 iOS.

发送的文件名相同

2- 来自 ios 我们正在使用这样的方式在服务器上上传图片。

[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\" ; filename=\"%@\"\r\n", imgName] dataUsingEncoding:NSUTF8StringEncoding]];

name=\"userfile\" 必须与服务器脚本匹配。