如何将 Java OutputStream 上传到 AWS S3
How to upload a Java OutputStream to AWS S3
我在内存中创建 PDF 文档为 OutputStream
s。这些应该上传到 S3。我的问题是无法直接从 OutputStream
创建 PutObjectRequest
(根据 this thread in the AWS dev forum). I use aws-java-sdk-s3
v1.10.8 in a Dropwizard app.
目前我能看到的两个解决方法是:
- 将
OutputStream
复制到 InputStream
并接受使用两倍的 RAM。
- 将
OutputStream
管道化为 InputStream
并接受额外线程的开销(参见 this answer)
如果我找不到更好的解决方案,我会选择 #1,因为在我的设置中,看起来我比 threads/CPU 更容易负担得起额外的内存。
有没有其他可能更有效的方法来实现我到目前为止忽略的这个?
编辑:
我的 OutputStream
是 ByteArrayOutputStream
您的 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
我在内存中创建 PDF 文档为 OutputStream
s。这些应该上传到 S3。我的问题是无法直接从 OutputStream
创建 PutObjectRequest
(根据 this thread in the AWS dev forum). I use aws-java-sdk-s3
v1.10.8 in a Dropwizard app.
目前我能看到的两个解决方法是:
- 将
OutputStream
复制到InputStream
并接受使用两倍的 RAM。 - 将
OutputStream
管道化为InputStream
并接受额外线程的开销(参见 this answer)
如果我找不到更好的解决方案,我会选择 #1,因为在我的设置中,看起来我比 threads/CPU 更容易负担得起额外的内存。
有没有其他可能更有效的方法来实现我到目前为止忽略的这个?
编辑:
我的 OutputStream
是 ByteArrayOutputStream
您的 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