当前位置: 首页 > 面试题库 >

具有InputStream长度示例的AmazonS3 putObject

鲁钱明
2023-03-14
问题内容

我正在使用Java将文件上传到S3-到目前为止,这是我得到的:

AmazonS3 s3 = new AmazonS3Client(new BasicAWSCredentials("XX","YY"));

List<Bucket> buckets = s3.listBuckets();

s3.putObject(new PutObjectRequest(buckets.get(0).getName(), fileName, stream, new ObjectMetadata()));

文件正在上传,但是未设置内容长度时会发出警告:

com.amazonaws.services.s3.AmazonS3Client putObject: No content length

specified for stream > data. Stream contents will be buffered in memory and
could result in out of memory errors.


这是我上传文件和stream变量是InputStream,从中我可以得到字节数组是这样的:IOUtils.toByteArray(stream)

因此,当我尝试像这样设置内容长度和MD5(从此处获取)时:

// get MD5 base64 hash
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(IOUtils.toByteArray(stream));
byte[] resultByte = messageDigest.digest();
String hashtext = new String(Hex.encodeHex(resultByte));

ObjectMetadata meta = new ObjectMetadata();
meta.setContentLength(IOUtils.toByteArray(stream).length);
meta.setContentMD5(hashtext);

这会导致以下错误从S3返回:

您指定的Content-MD5无效。

我究竟做错了什么?

任何帮助表示赞赏!

PS: 我在Google App Engine上-
无法将文件写入磁盘或创建临时文件,因为AppEngine不支持FileOutputStream。


问题答案:

因为从未回答过原始问题,而且我也遇到了同样的问题,所以针对MD5问题的解决方案是S3不需要我们通常考虑的十六进制编码的MD5字符串。

相反,我必须这样做。

// content is a passed in InputStream
byte[] resultByte = DigestUtils.md5(content);
String streamMD5 = new String(Base64.encodeBase64(resultByte));
metaData.setContentMD5(streamMD5);

本质上,他们想要MD5值的是Base64编码的原始MD5字节数组,而不是十六进制字符串。当我切换到此功能时,它开始对我非常有用。



 类似资料:
  • 以下完整长度示例指定YAML的构造,其中包括符号和各种表示,这些表示在以JSON格式转换或处理它们时将非常有用。 这些属性在JSON文档中也称为键名。 这些符号是出于安全目的而创建的。 上述YAML格式表示具有各种其他属性的默认值,适配器和主机的各种属性。 YAML还会记录生成的每个文件,这些文件会保留生成的错误消息的跟踪。 在以JSON格式转换指定的YAML文件时,得到所需的输出,如下所述 -

  • 我试图读取一个csv文件,并将其设置为转换为另一种格式,以节省一些工作时间,但当一行的长度小于预期列时,我正在加载它的JTable会引发异常。如果行长度<列长度,是否有方法创建空单元格? 因此,您可以看到getValueAt(int row,int col)方法,如果col超过String[].length将导致错误。

  • 问题内容: 我试图从表中获取所有列的列表,这些列表包含它们的数据类型,数据长度和该列中最长值的长度。 我使用此SQL来获取列及其数据类型和长度: 我有此SQL,用于获取值的最大长度: 但是我不知道如何将它们结合起来。我正在使用SQL Server 2008。 问题答案: 感谢您的建议。我想出了以下解决方案。它为我获取了我需要的数据,但是希望了解它是否可以提高效率。

  • 我有这个问题: 您将获得一个整数 A 和一个整数 k 的数组。您可以将 A 的元素递减到 k 次,目标是生成一个元素都相等的连续子数组。返回可以用这种方式生成的最长的连续子数组的长度。 例如,如果 A 是 [1,7,3,4,6,5] 并且 k 是 6,那么您可以生成 [1,7,3,4-1,6-1-1-1,5-1-1] = [1,7,3,3,3,3],因此您将返回 4。 最佳解决方案是什么?

  • 问题内容: 我有一个清单清单。每个子列表的长度在1到100之间。每个子列表在一组数据中的不同时间包含一个粒子ID。我想在给定的时间形成所有粒子ID的列表。为此,我可以使用以下方法: list2将包含list中每个子列表的首个元素。我不仅要对第一个元素执行此操作,还要对1到100之间的每个元素执行此操作。我的问题是,每个子列表都不存在元素号100(或66或77或其他)。 有什么方法可以创建列表列表,

  • 问题内容: 我需要比较两个byte []数组的元素,但只能比较固定长度。对于整个数组,我使用。当然,我可以复制子范围(),但我不想这样做。我也肯定应该有标准的方法来执行此操作,而无需执行新的实用程序方法。 我正式需要的是这样的: 有什么众所周知的东西吗?我看不到广泛使用的方法。 关于防止错误答案的要求:-数组等于长度限制。-我有手动执行功能,但我想将其替换为标准功能。-我不要任何副本。 先感谢您。