我正在开发一个连接到我的Tomcat / Jersey服务器的iOS应用程序。
我目前将图像上传到S3的方式是使用以下工作流程:
- 使用POST请求将图像上传到我服务器上的临时文件夹.Multipart Form数据
- 从temp文件夹中获取文件并使用Amazon Java SDK将其上传到S3
- 上传完成后,从服务器上的临时文件夹中删除图像文件到S3
我不希望我的iOS应用程序直接上传到S3,因为我想通过我的服务器执行某些操作,但在我看来,这似乎是多余的,并且会使进程变得比它可能需要的慢。有没有办法直接通过Amazon SDK流式传输文件,而不必将其临时保存到我的服务器?
答案 0 :(得分:2)
感谢您的建议。我使用您的答案通过直接通过亚马逊SDK上传输入流来解决它:
byte[] contents = IOUtils.toByteArray(inputStream);
InputStream stream = new ByteArrayInputStream(contents);
ObjectMetadata meta = new ObjectMetadata();
meta.setContentLength(contents.length);
meta.setContentType("image/png");
s3client.putObject(new PutObjectRequest(
bucketName, fileName, stream, meta)
.withCannedAcl(CannedAccessControlList.Private));
inputStream.close();
其中inputStream
是从iOS应用程序接收到我的服务器的输入流,而s3client
是使用AmazonS3Client
的{{1}}初始化。
答案 1 :(得分:1)
您可以使用HttpServletRequest .getInputStream()
将输入流保存到数据成员中,然后将其传递到S3 SDK:Execute one of the AmazonS3Client.putObject overloads depending on whether you are uploading data from a file, or a stream.
{{1}},以获取InputStream
上传成功/出错后,您可以向用户返回相关回复。
如果您需要帮助,请告诉我。
答案 2 :(得分:1)
如果您只想保护S3上传后面的某些身份验证机制,您可以在用户通过身份验证后生成pre-signed S3 upload url,然后您可以使用该URL直接从iOS上传到S3。这样可以满足您的身份验证要求,但可以保留Web服务器上的所有上传流量。
这是一种非常常见的设计模式,允许用户在身份验证后将文件上传到S3。