1

空のBLOBストレージに.netコアWeb API経由で受け取ったIFormFileを追加しようとしています。空のBLOBストレージにストリームを追加する

static internal CloudStorageAccount StorageAccount => 
    new CloudStorageAccount(new StorageCredentials(AccountName, AccessKey, AccessKeyName), true); 

// Create a blob client. 
static internal CloudBlobClient BlobClient => StorageAccount.CreateCloudBlobClient(); 

// Get a reference to a container 
static internal CloudBlobContainer Container(string ContainerName) 
         => BlobClient.GetContainerReference(ContainerName); 

static internal CloudBlobContainer ProfilePicContainer 
     => Container(ProfilePicContainerName); 

を今私はこのようなProfilePicContainerを使用します:

var Container = BlobStorage.ProfilePicContainer; 
string fileName = Guid.NewGuid().ToString("N") + Path.GetExtension(ProfileImage.FileName); 
var blockBlob = Container.GetBlockBlobReference(fileName); 
var fileStream = ProfileImage.OpenReadStream(); 
fileStream.Position = 0; 
await blockBlob.UploadFromStreamAsync(fileStream); 

これは私に次のエラーを与える:

Microsoft.WindowsAzure.Storage.StorageException: 'Cannot access a closed Stream.'

Inner Exception ObjectDisposedException: Cannot access a closed Stream.

デバッグするとき、私はこれらは私が設定したプロパティですfileStream.Position = 0の位置はすでに0であることに気づいた。しかし、私はこのエラーが発生してから行を追加した。また、待ち受けラインでは、fileStream_disposedはfalseに設定されています。

また、BLOB接続に関しては、文字列定数AccessKeyの無効な値を設定しようとしましたが、まったく同じエラーが表示されます。つまり、接続さえすればいいのかどうかわかりません。私はblobBlock内のすべての値をデバッガでチェックしましたが、接続されているかどうかを確認する方法はわかりません。

+0

以上の修正だった 'fileStream'はすでになく、AzureストレージSDKの問題を閉じているように聞こえますか?あなたは 'fileStream'ストリームにまったくアクセスできますか? '(var testStream = File.OpenWrite(Path.GetTempFileName()))fileStream.CopyTo(testStream)'を使ってディスクに書き込めますか? –

+0

はい、ファイルに書き込み、バイトに書き込むためにfileStreamを試しました。どちらもうまく動作します。 –

+0

ブロックを使用してストリームを入れてみてください。 –

答えて

0

ストリームから直接書き込むときに問題があるようです。ストリームをバイト配列に変換してコードを実行することができました。

await blockBlob.UploadFromByteArrayAsync(ReadFully(fileStream, blockBlob.StreamWriteSizeInBytes), 
          0, (int)fileStream.Length); 

ReadFullyはこの答えhttps://stackoverflow.com/a/221941

static byte[] ReadFully(Stream input, int size) 
{ 
    byte[] buffer = new byte[size]; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     int read; 
     while ((read = input.Read(buffer, 0, size)) > 0) 
     { 
      ms.Write(buffer, 0, read); 
     } 
     return ms.ToArray(); 
    } 
} 
関連する問題