C# AmazonS3文件中满是零

C# AmazonS3文件中满是零,c#,amazon-web-services,amazon-s3,C#,Amazon Web Services,Amazon S3,我正在使用C#中的官方客户端从AWS S3 bucket下载PDF文件。它似乎下载了整个文件,但所有内容都是8192(0x2000)字节后的0。 见下文(左侧为原始文件,右侧为S3下载): 任何关于为什么会发生这种情况的想法都将不胜感激 代码如下: var client = new AmazonS3Client( new AmazonS3Config { RegionEndpoint = RegionEndpoint.EUWest1 }); var t

我正在使用C#中的官方客户端从AWS S3 bucket下载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;
}
提前感谢,


Steve。

对于遇到此问题的任何其他人,都必须反复调用流上的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;
}
使用(var-stream=transferUtility.OpenStream(请求))
{
var位置=0;
变量长度=流长度;
变量字节=新字节[长度];
做
{
position+=stream.Read(字节,位置,(int)(stream.Length-position));
}而(位置<长度);
stream.Close();
返回字节;
}
谢谢约翰指出这一点

编辑:


或者检查一下JohnLBevan指出的这个扩展方法:

Read
返回一个int和它读取的字节数。它不能保证是您要求的长度。对于S3,我看到一次读取只有128字节。你通过S3接口验证了文件下载的正确性吗?啊,好的,谢谢John。我猜我会一直调用Read,直到完整的流被读取。谢谢。BlueWater86,是的,我有-它确实可以通过用户界面正确下载。我想John可能找到了答案。仅供参考:Andrei在这里为相同的场景提供了一种有用的扩展方法:-与您的实现相比,这有一个有用的优点,即如果您过早到达流的末尾,它会抛出一个异常;i、 而不是陷入无限循环。