【问题标题】:S3 warning: "No content length specified for stream data"S3 警告:“没有为流数据指定内容长度”
【发布时间】:2016-01-03 04:47:30
【问题描述】:

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

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

文件是这样上传的:

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

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

有人知道为什么这个警告信息会突然开始出现吗?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    就我而言,我必须缓冲流,所以我使用了类似的东西(来自this 参考)。

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

    【讨论】:

    • 您在文档中的引用是关于内容类型的,而您的其余答案是关于内容长度的。
    • 仍然使用 ByteBuffer 将整个文件加载到内存中。拥有自己的代码而不是亚马逊将整个内容加载到内存中并没有任何改进。
    猜你喜欢
    • 2014-02-16
    • 1970-01-01
    • 2014-04-02
    • 2021-10-31
    • 2016-11-25
    • 2013-02-15
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多