CloudBlob.DownloadToStream返回null

fib*_*ics 12 c# cloud blob azure azure-storage

我正在尝试通过流从cloudBlob下载文件.我参考这篇文章CloudBlob

这是下载blob的代码

public Stream DownloadBlobAsStream(CloudStorageAccount account, string blobUri)
{
    Stream mem = new MemoryStream();
    CloudBlobClient blobclient = account.CreateCloudBlobClient();
    CloudBlockBlob blob = blobclient.GetBlockBlobReference(blobUri);

    if (blob != null)
        blob.DownloadToStream(mem);

    return mem;
}  
Run Code Online (Sandbox Code Playgroud)

并将代码转换为字节数组

    public static byte[] ReadFully(Stream input)
    {
        byte[] buffer = new byte[16 * 1024];
        using (MemoryStream ms = new MemoryStream())
        {
            int read;
            while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
            return ms.ToArray();
        }
    }  
Run Code Online (Sandbox Code Playgroud)

但我总是得到零价值.以下是流式文件的内容.

在此输入图像描述

这有什么问题?请帮忙.

编辑

ReadFully不允许在Position 方法中将Position设置为0 ,所以我把它放在里面DownloadBlobAsStream

这应该现在有效:

public Stream DownloadBlobAsStream(CloudStorageAccount account, string blobUri)
{
    Stream mem = new MemoryStream();
    CloudBlobClient blobclient = account.CreateCloudBlobClient();
    CloudBlockBlob blob = blobclient.GetBlockBlobReference(blobUri);

    if (blob != null)
        blob.DownloadToStream(mem);
    mem.Position = 0;   
    return mem;
} 
Run Code Online (Sandbox Code Playgroud)

Avk*_*han 13

你的问题是你的输入流指针被设置为蒸汽结束(参见屏幕截图,长度和位置都显示相同的值)这就是为什么当你读它时你总是得到null.您需要设置为使用Stream.Position = 0将流指针输入为0,如下所示:

public static byte[] ReadFully(Stream input)
{
    byte[] buffer = new byte[16 * 1024];

    input.Position = 0; // Add this line to set the input stream position to 0

    using (MemoryStream ms = new MemoryStream())
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
        return ms.ToArray();
    }
} 
Run Code Online (Sandbox Code Playgroud)

  • 我认为CloudBlockBlob.OpenRead()可用于获取可用于访问blob部分的流,而无需先下载整个内容. (3认同)
  • 那么这是否意味着DownloadToStream实际上没有达到它的承诺?而不是允许用户真正地从azure中流出数据,而这只是与DownloadByteArray几乎完全相同,因为它迫使你将整个文件读入内存? (2认同)

dev*_*ost 9

如何在CloudBlob对象上使用OpenRead()方法?

public static string ReadFully(string blobUri, string itemUri)
{
    // e.g. itemUri == "foo.txt"
    //   if there is a folder "bar" with foo.txt, provide instead: "bar/foo.txt"
    CloudBlobContainer cloudBlobContainer = new CloudBlobContainer(new Uri(blobUri));
    CloudBlob blobReference = cloudBlobContainer.GetBlobReference(itemUri);

    using (var stream = blobReference.OpenRead())
    {
        using (StreamReader reader = new StreamReader(stream))
        {
            return reader.ReadToEnd();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)