2016-07-15 9 views
2

私はAzureのblobストレージに保存されている画像を表示しようとしているasp mvcアプリケーションを持っています。紺碧の塊の容器から画像を表示する

文字列を返すと、ブラウザは壊れたイメージとして表示されます。私は右クリックして「検査」と生成されたURIをクリックすると、私は次のようなメッセージ

BlobNotFound The specified blob does not exist. RequestId:f7c32876-0001-013e-539d-dede28000000 Time:2016-07-15T13:30:49.7560775Z

を受け取る私はAzure Storage Explorerをダウンロードして、ファイルを見ることができます。コンテナのアクセスレベルをread access for blobs onlyからno public accessに変更しようとしました(ただし、私はそのコードで、PublicAccess = BlobContainerPublicAccessType.Blobというコードを使っていました)。

ストレージに保存されている画像を表示するにはどうすればよいですか?

public string Index() 
    { 
     CloudBlockBlob blob = GetBlobInContainer("blobContainerTjsContainer", "PS-ICON-120x120_140.jpg"); 
     return "<img src="+ blob.Uri.AbsoluteUri +" alt='PS Image'>"; 
    } 

CloudBlockBlob GetBlobInContainer(string container, string fileName) 
    { 
     //use web.config appSetting to get connection setting .NET Framework's ConfigurationManager class can also be used for this 
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 
     //create the blob client 
     CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
     //retrieve a refernce to a container 
     CloudBlobContainer blobContainer = blobClient.GetContainerReference(CloudConfigurationManager.GetSetting(container)); 
     //set permission to show to public 
     blobContainer.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob}); 
     blobContainer.CreateIfNotExists(); 
     // Retrieve reference to a blob named "photo1.jpg". 
     CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(fileName); 
     return blockBlob; 
    } 

EDIT

さらに読み取り後、私は、これが例外

戻るを変更

// Retrieve reference to a blob named "photo1.jpg". 
     CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(fileName); 
     blockBlob.Properties.ContentType = "image/jpg"; 
     blockBlob.SetProperties(); 
     return blockBlob; 

// Retrieve reference to a blob named "photo1.jpg". 
     CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(fileName); 
     return blockBlob; 

を変更しました

アップロード時に別の処理を行う必要はありますか?

編集

@Gaurav Mantri

azure storage

私はそれがapplication/octet-streamとして格納されていることがわかりますが、私は、画像/ JPGに変更しようとしたとき

blockBlob.Properties.ContentType = "image/jpg"; 
    blockBlob.SetProperties(); 
を使用することができます

私は設定されたプロパティで404の例外を得ました。私は、画像を引くと、デバッグ中に私はイメージ名が、それは私がアップロードの時点で

をアップロードしたとき、私はからのコメントへ

void UploadFile(string filePath) 
    { 
     //use web.config appSetting to get connection setting .NET Framework's ConfigurationManager class can also be used for this 
     CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 
     //create the blob client 
     CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
     //retrieve a refernce to a container 
     CloudBlobContainer blobContainer = blobClient.GetContainerReference(CloudConfigurationManager.GetSetting("blobContainerTjsContainer")); 
     //create a container if it doesnt exist 
     blobContainer.CreateIfNotExists(); 
     //gets the reference to the blob that will be written or OVER written 
     CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference("my-image-blob"); 

     using (var fileStream = System.IO.File.OpenRead(filePath)) 
     { 
      blockBlob.UploadFromStream(fileStream); 
     } 
    } 
+0

あなたのBLOBコンテナに 'PS-ICON-120x120_140.jpg'というファイルがありますか? Azure Storage Explorerからそのスクリーンショットを共有できますか? –

+0

私は十分な余分な情報を追加しようとしましたが、もっと必要な場合にお知らせください – tony09uk

+1

ありがとうございます。だから私はいくつか気づいた:1) 'UploadFile'では、' GetBlobInContainer'関数でBLOBコンテナのACLを設定しているようにしていません。 blobコンテナのACLが本当に 'Blob'で、' Private'ではないかどうか確認してください。 2)実際に 'GetBlobInContainer'関数に' UploadFile'で行っているものとは違うブロブ名を渡しています。両方が同じであることを確認してください。 –

答えて

4

おかげで以下のコードを使用したのと同じである見ることができますGaurav私は私の問題を解決することができました。

私は

CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(fileName); 
blockBlob.Properties.ContentType = "image/jpg"; 
blockBlob.SetProperties(); 
return blockBlob; 

以下のようにファイルをダウンロードしたが、ファイルを保存するとき、それはapplication/octet-streamとして保存されていたので、私は、コンテンツタイプを設定していませんでしたし、上記のコードは、呼び出し時にタイプを変換しようとしていましたファイル。アップロード前にタイプを設定することで、私は単にファイルを呼び出して、それを画像として表示させることができました。

CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference("my-image-blob"); 
blockBlob.Properties.ContentType = "image/jpg"; 

using (var fileStream = System.IO.File.OpenRead(filePath)) 
{ 
    blockBlob.UploadFromStream(fileStream); 
} 
関連する問題