2015-10-06 87 views
3

即使基础aws库的用法或基础aws库没有变化,我突然看到此警告消息被记录。我一直在使用aws-java-sdk版本1.6.9.1S3警告:“没有为流数据指定内容长度”

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

这是howthe文件上传:

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

我怀疑我可能会看到这一点,因为我没有设置ObjectMetadata对象的内容长度,但是这究竟是怎么回事之前,没有报警正在产生。

任何人都有任何洞察力,为什么这个警告讯息会突然开始出现?

谢谢!

回答

1

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

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()); 
+1

来自文档的引用是关于内容类型的,其余的答案是关于内容长度。 – bhspencer