将图像上载到S3 Bucket-Java SDK

将图像上载到S3 Bucket-Java SDK,java,amazon-web-services,file-upload,amazon-s3,Java,Amazon Web Services,File Upload,Amazon S3,我正在开发一个iOS应用程序,它连接到我的Tomcat/Jersey服务器 我目前将图像上传到S3的方式是使用以下工作流: -使用POST请求多部分表单数据将图像上载到我的服务器上的临时文件夹 -从temp文件夹中获取文件,并使用Amazon Java SDK将其上载到S3 -上传到S3完成后,从服务器上的临时文件夹中删除映像文件 我不希望我的iOS应用程序直接上传到S3,因为我想通过我的服务器执行一些操作,但在我看来,这似乎是多余的,会使过程比需要的慢。有没有一种方法可以直接通过Amazon

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

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


我不希望我的iOS应用程序直接上传到S3,因为我想通过我的服务器执行一些操作,但在我看来,这似乎是多余的,会使过程比需要的慢。有没有一种方法可以直接通过Amazon SDK传输文件,而不必临时保存到我的服务器?

您可以使用
.getInputStream()获取InputStream
要将输入流保存到数据成员中,然后将其传递到S3 SDK:
根据您是从文件还是从流上载数据,执行一个AmazonS3Client.putObject重载。

上传成功/出错后,您可以向用户返回相关响应


如果您还需要帮助,请告诉我。

如果您只是想在某种身份验证机制后保护S3上载,您可以在用户经过身份验证后生成一个,然后您可以使用该URL从iOS直接上载到S3。这将满足您的身份验证要求,但保持所有上传流量远离您的web服务器


这是一种非常常见的设计模式,允许用户在身份验证后将文件上载到S3。

感谢您的建议。我使用您的答案解决了这个问题,通过Amazon 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
是使用
BasicAWSCredentials
初始化的
AmazonS3Client

说清楚一点,你是说在上传到S3之前需要在Tomcat服务器上对图像进行一些处理吗?或者,在允许用户上传文件之前,您只是想通过Tomcat验证用户身份验证之类的东西吗?我想执行用户身份验证,您是对的。不是图像处理。抱歉搞混了。