S3警告:“没有为流数据指定内容长度”

时间:2015-10-06 09:58:58

标签: amazon-web-services amazon-s3 aws-sdk

我突然开始看到记录此警告消息,即使底层aws libs的使用没有变化。我一直在使用aws-java-sdk版本1.6.9.1

  

没有为流数据指定内容长度。流内容将缓冲在内存中,并可能导致内存不足错误。

这是文件的上传方式:

client.putObject(bucketName, key, new ByteArrayInputStream(data), new ObjectMetadata())

我怀疑我可能会看到这个,因为我没有在ObjectMetadata对象上设置内容长度,但这就是之前的情况,并且没有生成警告。

任何人都知道为什么这条警告信息会突然出现?

谢谢!

1 个答案:

答案 0 :(得分:2)

我知道这已经有一段时间但我今天必须处理这个并在文档中找到了这个解释。

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/ObjectMetadata.html#setContentLength-long-

  

上传文件时,AWS S3 Java客户端将尝试确定   如果还没有设置正确的内容类型。用户是   负责确保在上传时设置合适的内容类型   流。如果没有提供内容类型且无法确定   文件名,默认内容类型," application / octet-stream",   将被使用。

     

有关Content-Type标头的详细信息,请参阅   http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17

在我的情况下,我不得不缓冲流,所以我使用了这样的东西:

https://books.google.com/books?id=cXggAQAAQBAJ&pg=PA377&lpg=PA377&dq=content+length+of+bytebuffer+java&source=bl&ots=AQSUOUwoI6&sig=tdok7YyipU7YUI6p1Bu_2X9HT6s&hl=en&sa=X&ved=0ahUKEwigi_DhiJPVAhVk8IMKHVWLBmAQ6AEIiQEwCA#v=onepage&q=content%20length%20of%20bytebuffer%20java&f=false

ByteBuffer buffer = new ByteBuffer(...)
...
ObjectMetadata meta = new ObjectMetadata();
meta.setContentLength(buffer.limit());