将图像上传到S3 Bucket - Java SDK

时间:2016-02-23 15:59:14

标签: java amazon-web-services file-upload amazon-s3

我正在开发一个连接到我的Tomcat / Jersey服务器的iOS应用程序。

我目前将图像上传到S3的方式是使用以下工作流程:
- 使用POST请求将图像上传到我服务器上的临时文件夹.Multipart Form数据
- 从temp文件夹中获取文件并使用Amazon Java SDK将其上传到S3
- 上传完成后,从服务器上的临时文件夹中删除图像文件到S3

我不希望我的iOS应用程序直接上传到S3,因为我想通过我的服务器执行某些操作,但在我看来,这似乎是多余的,并且会使进程变得比它可能需要的慢。有没有办法直接通过Amazon SDK流式传输文件,而不必将其临时保存到我的服务器?

3 个答案:

答案 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。