【问题标题】:Amazon S3 File Full of Zeros满是零的 Amazon S3 文件
【发布时间】:2018-05-21 12:18:34
【问题描述】:

我正在使用 C# 中的官方客户端从 AWS S3 存储桶下载 PDF 文件。它似乎下载了整个文件,但在 8192 (0x2000) 字节之后一切都是 0。 见下图(左为原始文件,右为 S3 下载):

任何关于为什么会发生这种情况的想法将不胜感激。

代码如下:

var client = new AmazonS3Client(
    new AmazonS3Config
    {
        RegionEndpoint = RegionEndpoint.EUWest1
    });

var transferUtility = new TransferUtility(client);

var request = new TransferUtilityOpenStreamRequest
{
    BucketName = bucketName,
    Key = key
};

using (var stream = transferUtility.OpenStream(request))
{
    var bytes = new byte[stream.Length];

    stream.Read(bytes, 0, (int)stream.Length);

    stream.Close();

    return bytes;
}

提前致谢,

史蒂夫。

【问题讨论】:

  • Read 返回一个带有它读取的字节数的 int。不能保证是您要求的长度。使用 S3,我在一次读取中看到了只有 128 个字节。
  • 您通过S3接口验证文件下载正确吗?
  • 啊,好的,谢谢约翰。我猜我会一直调用 Read 直到读取完整的流。谢谢。
  • BlueWater86,是的,我有 - 它确实通过 UI 正确下载。我认为约翰可能已经找到了答案。

标签: c# amazon-web-services amazon-s3


【解决方案1】:

对于遇到此问题的其他人来说,这是一个必须在流上重复调用 Read 直到收到所有字节的情况:

using (var stream = transferUtility.OpenStream(request))
{
    var position = 0;
    var length = stream.Length;

    var bytes = new byte[length];

    do
    {
        position += stream.Read(bytes, position, (int)(stream.Length - position));
    } while (position < length);

    stream.Close();

    return bytes;
}

感谢约翰指出这一点。

编辑:

或者查看 JohnLBevan 指出的这种扩展方法:https://stackoverflow.com/a/24412022/361842

【讨论】:

  • 仅供参考:Andrei 在这里为同样的场景提供了一种有用的扩展方法:stackoverflow.com/a/24412022/361842 - 与您的实现相比,这有一个有用的好处,即如果您到达流的末尾,它会引发异常过早地;即,而不是陷入无限循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2018-08-01
相关资源
最近更新 更多