gpt4 book ai didi

c# - 从 Amazon AWS S3 下载对象时流仅部分读取

转载 作者:行者123 更新时间:2023-11-30 22:59:26 28 4
gpt4 key购买 nike

<分区>

我正在尝试使用 C# 从我的存储桶中简单地下载一个对象,就像我们可以在 S3 示例中找到的那样,但我无法弄清楚为什么流不会完全复制到我的字节数组中。仅复制前 8192 个字节而不是整个流。

我尝试过使用 Amazon.S3.AmazonS3ClientAmazon.S3.Transfer.TransferUtility,但在这两种情况下,实际上只复制了第一个字节进入缓冲区。

var stream = await _transferUtility.OpenStreamAsync(BucketName, key);
using (stream)
{
byte[] content = new byte[stream.Length];
stream.Read(content, 0, content.Length);
// Here content should contain all the data from the stream, but only the first 8192 bytes are actually populated.
}

调试时,我看到流类型是 Amazon.Runtime.Internal.Util.Md5Stream,在流内部,调用 Read() 属性 CurrentPosition = 0。调用之后,CurrentPosition变成了8192,看来确实只读取了前8K的数据。流的总 Length 为 104042。

如果我对 stream.Read() 进行更多调用,我会看到更多数据被读取并且 CurrentPosition 的值增加。但是 CurrentPosition 不是公共(public)属性,我无法在我的代码中访问它来制作 while() 循环(并且必须编写这样的循环来读取所有数据似乎有点笨拙)。

为什么我的代码中只读取了前 8K?我应该如何继续阅读整个流?

我尝试调用 stream.Flush(),但没有解决问题。

编辑 1

我修改了我的代码,使其执行以下操作:

var stream = await _transferUtility.OpenStreamAsync(BucketName, key);
using (stream)
{
byte[] content = new byte[stream.Length];
var bytesRead = 0;

while (bytesRead < stream.Length)
bytesRead += stream.Read(content, bytesRead, content.Length - bytesRead);
}

而且它有效。但是看起来还是笨重的。我必须这样做正常吗?

编辑 2

最终的解决方案是创建一个正确大小的 MemoryStream,然后调用 CopyTo()。因此,如果 Read() 在整个流被读取之前开始返回 0,那么不再有笨拙的循环并且没有无限循环的风险:

var stream = await _transferUtility.OpenStreamAsync(BucketName, key);
using (stream)
{
using (var memoryStream = new MemoryStream((int)stream.Length))
{
stream.CopyTo(memoryStream);
var myBuffer = memoryStream.GetBuffer();
}
}

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com