15

ストリーム経由で cloudBlob からファイルをダウンロードしようとしています。この記事を参照しますCloudBlob

ブロブをダウンロードするコードは次のとおりです

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;
}  

そしてそれをバイト配列に変換するコード

    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();
        }
    }  

しかし、私は常に null 値を取得します。以下は、ストリーミングされたファイルの内容です。

ここに画像の説明を入力

これの何が問題なのですか?助けてください。

編集

メソッド内で Position を 0 に設定するReadFullyことは許可されていないため、内部に配置します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;
} 
4

3 に答える 3

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();
    }
} 
于 2012-06-05T06:22:55.797 に答える
10

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();
        }
    }
}
于 2016-08-09T22:49:32.390 に答える