当前位置: 首页 > 知识库问答 >
问题:

使用高级多部分上传仍然没有给出内容长度指定警告

薛承基
2023-03-14

即使我使用的是高级多部分,我仍然在控制台中收到警告:

WARN - com.amazonaws.services.s3.AmazonS3Client - No content length specified for stream data.  Stream contents will be buffered in memory and could result in out of memory errors.

这就是我使用高级分段上传的方式,就像这里一样:https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-upload-object.html

      val tm: TransferManager = TransferManagerBuilder
        .standard()
        .withS3Client(s3Client)
        .withMultipartUploadThreshold(5248000)
        .build();

      val metadata = new ObjectMetadata()
      metadata.setContentType(mimeType)
      val request = new PutObjectRequest(bucketName, key, inputStream, metadata)

      val upload = tm.upload(request)
      upload.waitForCompletion()

5248000是5MB,我尝试上传比这大得多的文件,所以它应该使用多部分策略,正如它在with MultipartUploadThreshold文档中所说:

设置何时使用分段上传的大小阈值(以字节为单位)。超过此大小的上传将自动使用分段上传策略,而小于此阈值的上传将使用单个连接来上传整个对象。

为什么它仍然发出这个警告?

共有1个答案

冷夜洛
2023-03-14

AWS SDK for Java的文档在ObjectMetadata中提到了这一点:

将对象上传到S3时,此字段是必需的,但是当直接处理文件时,Amazon Web Services S3 Java客户端会自动设置它。当直接从流上传时,如果可能,设置该字段。否则,客户端必须缓冲整个流,以便在将数据发送到亚马逊S3之前计算内容长度。

换句话说,您需要显式调用元数据。在构造PutObjectRequest对象之前,使用文件或流大小设置ContentLength(x)。如果不这样做,AWS SDK将需要在ram中缓冲整个流,这可能会耗尽较大对象的内存,从而触发您看到的警告。

 类似资料:
  • 我有下面的代码发送一个多部分/表单数据请求。 在我的RestClient类中,我使用下面几行代码使用JAX-RS客户机对象发送POST请求 我使用Wiremock检查了HTTP请求主体,如下所示: 我想知道请求负载中的内容长度标头是如何丢失的。有没有办法设置请求的内容长度标头? 请帮帮我。

  • 我突然开始看到这条警告消息被记录下来,尽管底层aws库的使用或没有任何变化。我一直用的是1.6.9.1版的aws-java-sdk 没有为流数据指定内容长度。流内容将在内存中缓冲,可能会导致内存不足错误。 文件上传方式如下: 我怀疑我可能看到了这一点,因为我没有在ObjectMetadata对象上设置内容长度,但这就是之前的情况,并且没有生成警告。 有人知道为什么这个警告信息会突然出现吗? 谢谢

  • 我需要上传一个更大的文件到 AWS 冰川的评估。由于大小,我无法在一个请求中执行此操作,因此我需要将其拆分为较小的部分并使用分段上传。 Boto3是否包含一个方法,该方法获取一个大文件,拆分并逐个上传它的部分?正如我所见Java客户端有这样的方法(取自AWS文档): 高级API提供了一种方法,您可以使用该方法上传任何大小的存档。根据您要上传的文件,该方法可以在单个操作中上传存档,也可以使用Amaz

  • 使用简单的按预期设置所有标头。 什么样的问题可能导致这种行为?

  • 当我试图发布一些数据,超过php.inipost_max_size设置我得到这个错误: 警告:未知:第0行中X字节的帖子内容长度超过Y字节的限制。 我不想增加post_max_size,我只想能够关闭警告,并告诉帖子数据是否超过post_max_size。我试图用error_reporting打开警告,但是因为警告在第0行,所以没有帮助。

  • 问题内容: Redux发出警告: 减速器的唯一操作是以下操作: 如果我使用[… spread],如何改变状态? 问题答案: 在这里类似。它创建一个新的数组,但对象 的 数组与共享。如果要对其进行突变,则需要制作每个项目的副本。 您可以使用进行此操作,类似于您对返回值所做的操作: 或者(如您在自己的答案中所建议),您可以使用对象扩展表示法: