如何将 Java OutputStream 上传到 AWS S3

How to upload a Java OutputStream to AWS S3

我在内存中创建 PDF 文档为 OutputStreams。这些应该上传到 S3。我的问题是无法直接从 OutputStream 创建 PutObjectRequest(根据 this thread in the AWS dev forum). I use aws-java-sdk-s3 v1.10.8 in a Dropwizard app.

目前我能看到的两个解决方法是:

  1. OutputStream 复制到 InputStream 并接受使用两倍的 RAM。
  2. OutputStream 管道化为 InputStream 并接受额外线程的开销(参见 this answer

如果我找不到更好的解决方案,我会选择 #1,因为在我的设置中,看起来我比 threads/CPU 更容易负担得起额外的内存。

有没有其他可能更有效的方法来实现我到目前为止忽略的这个?

编辑: 我的 OutputStreamByteArrayOutputStream

您的 OutputStream 的实际类型是什么?因为它是一个抽象的 class,所以没有说明数据实际去向(或者它是否去任何地方)。

但我们假设您谈论的是 ByteArrayOutputStream,因为它至少将数据保存在内存中(与其他许多不同)。

如果您从其缓冲区中创建 ByteArrayInputStream,则不会有重复的内存。这就是流媒体的全部理念。

我通过继承 ConvertibleOutputStream 解决了这个问题:

public class ConvertibleOutputStream extends ByteArrayOutputStream {
    //Craetes InputStream without actually copying the buffer and using up mem for that.
    public InputStream toInputStream(){
        return new ByteArrayInputStream(buf, 0, count);
    }
}

另一个解决方法是使用 s3 的预签名 url 功能。 由于预签名 url 允许您使用 http put 或 post 将文件上传到 s3,因此可以将输出流发送到 HttpURLConnection。 sample code from amazon