web-dev-qa-db-ja.com

blockblobのアップロードとcontenttypeの設定

C#のMicrosoft.WindowsAzure.Storage.*ライブラリを使用しています。

これは私が物事をストレージにアップロードする方法です:

// Store in storage
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("...connection string...");
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("pictures");

// Create container if it doesnt exist
container.CreateIfNotExists();

// Make available to everyone
container.SetPermissions(new BlobContainerPermissions
{
    PublicAccess = BlobContainerPublicAccessType.Blob
});

// Save image
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blah.jpg");
blockBlob.UploadFromByteArray(byteArrayThumbnail, 0, byteArrayThumbnail.Length);
blockBlob.Properties.ContentType = "image/jpg";  // *** NOT WORKING ***

ストレージにアップロードしたものはすべて、コンテンツタイプ「application/octet-stream」で保存されていますが、値が「image/jpg」のセッターを使用しています(コードの最後の行を参照)。

では、質問1:ContentTypeセッターが機能しないのはなぜですか?

そして質問#2:Windows Azure管理ポータルを使用してコンテンツタイプを「image/jpg」に手動で変更し、ファイルの絶対URIをブラウザーのアドレスフィールドにコピーしてEnterキーを押すと、代わりにjpgファイルがダウンロードされますの表示されます。このMIMEタイプは、ダウンロードされる代わりに表示されるはずではありませんか?どうすれば変更できますか?

22
sports

実際には、SetPropertiesメソッドを呼び出す必要はありません。 blobのアップロード中にコンテンツタイプを設定するには、uploadメソッドを呼び出す前にContentTypeプロパティを設定するだけです。したがって、コードは次のようになります。

// Save image
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blah.jpg");
blockBlob.Properties.ContentType = "image/jpg";
blockBlob.UploadFromByteArray(byteArrayThumbnail, 0, byteArrayThumbnail.Length);

これでうまくいくはずです。

97
Gaurav Mantri

Propertiesに変更を加えたら、実際にそれらの変更を保存するために CloudBlockBlob.SetProperties() を呼び出す必要があります。

LINQ-to-Entitiesに似たものと考えてください。ローカルオブジェクトに必要な変更を加えることができますが、SaveChanges()を呼び出すまで、実際には何も保存されません。

22
Nathan A

azure Blob SDKの新しいバージョンでは、これは機能しなくなりました。

これは私のために働きました:

CloudBlockBlob blockBlob = cloudBlobContainer.GetBlockBlobReference(blobName);
blockBlob.Properties.ContentType = contentType;                            
await blockBlob.SetPropertiesAsync();
1
aumanjoa

明らかに、Gaurav Mantriの回答のようにcreateに設定するのが最善です。その時点を過ぎており、ここで他の回答を更新する必要がある場合、混乱する可能性があります。

// GET blob
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName); 

// if you don't do this you'll wipe properties you didn't mean to
await blockBlob.FetchAttributesAsync();

// SET
blockBlob.Properties.ContentType = mimetype;

// SAVE
await blockBlob.SetPropertiesAsync();
0
ono2012