1

Azure ストレージからダウンロードされた inclomplete BLOB に問題があります。保存されるファイルは画像です。ダウンロードされたほとんどすべてのファイルは、下部の数行が欠落しています。ブロブを確認したところ、正しくアップロードされていました。Azure サービスから BLOB をダウンロードするために、次のコードを使用しています。

    private async Task Download(CloudBlobClient client)
    {

            try
            {
                _media = await _directory.CreateFileAsync(ResourceName, CreationCollisionOption.FailIfExists);
            }
            catch (Exception)
            {
                return;
            }

            using (var stream = await _media.OpenAsync(FileAccessMode.ReadWrite))
            {
                var blob = await GetBlob(client);
                await blob.DownloadToStreamAsync(stream);
                _category.NotifyAzureProgress();
                await stream.FlushAsync();
            }
    }

メソッド GetBlob() は次のようになります。

    private async Task<CloudBlockBlob> GetBlob(CloudBlobClient client)
    {
        CloudBlobContainer container = client.GetContainerReference(ContainerName);
        await container.CreateIfNotExistsAsync();

        var blob = container.GetBlockBlobReference(ResourceName);

        return blob;
    }

アップロード コード:

    private async Task UploadAsync(CloudBlobClient client)
    {
        _media = await _directory.GetFileAsync(ResourceName);
            using (var stream = await _media.OpenAsync(FileAccessMode.Read))
            {
                var blob = await GetBlob(client);
                await blob.UploadFromStreamAsync(stream);
                _category.NotifyAzureProgress();
            }
    }

助けてくれてありがとう!

編集: 1 つの詳細を見逃していることに気付きました。ダウンロードした画像の寸法は正しいのですが、下から数行が黒くなっています。ソース画像と同じピクセルではありません。MD5 ハッシュを確認しましたが、それらが一致している間、外部アプリから画像をダウンロードすると、上記のコードでダウンロードすると一致しません。

Edit2: CloudBlob と出力ストリームのプロパティを調べた後、ダウンロード後に blob が正しい長さを示していても、ストリームは通常、少し低いことを示していることに気付きました。範囲内でダウンロードしようとしましたが、役に立ちませんでした

4

1 に答える 1

0

わかりましたので、WinRT Azure ライブラリを標準の .NET HttpClient と組み合わせて部分的に使用することで、画像をダウンロードすることができました。

BlockBlobReference には Shared Access Signature を作成するメソッドがあるため (そして、自分で構築しようとしたくなかったため)、Azure Lib を使用して初期接続を確立し、Blob 参照のみを取得しました。次に、HttpClient を作成し、SAS を使用してダウンロード URL を作成し、その URL に対して GET 要求を発行しました。これは最終的に機能し、すべての画像をそのままダウンロードしました。

彼らの代わりに私のダウンロード方法を使用するとすべてが解決したため、公式ライブラリに奇妙なバグがある可能性があると思います。

コードサンプル:

internal async Task Download(CloudBlobClient client)
    {

        try
        {
            _media = await _directory.CreateFileAsync(ResourceName, CreationCollisionOption.FailIfExists);
        }
        catch (Exception)
        {
            return;
        }
        try
        {
                var blob = await GetBlob(client);
                HttpClient httpClient = new HttpClient();
                var date = DateTime.UtcNow;
                var policy = new SharedAccessBlobPolicy();
                policy.Permissions = SharedAccessBlobPermissions.Read;
                policy.SharedAccessStartTime = new DateTimeOffset(date);
                policy.SharedAccessExpiryTime = new DateTimeOffset(date.AddDays(1));
                var signature = blob.GetSharedAccessSignature(policy);
                var uriString = string.Format("{0}{1}", blob.Uri.ToString(), signature);
                var data = await httpClient.GetByteArrayAsync(uriString);
                var buf = new Windows.Storage.Streams.Buffer((uint)data.Length);
                await FileIO.WriteBytesAsync(_media, data);
                _category.NotifyAzureProgress();

        }
        catch (Exception e)
        {
            _media.DeleteAsync();
            throw e;
        }
    }
于 2013-05-09T22:49:37.563 に答える