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タイプは、ダウンロードされる代わりに表示されるはずではありませんか?どうすれば変更できますか?
実際には、SetPropertiesメソッドを呼び出す必要はありません。 blobのアップロード中にコンテンツタイプを設定するには、uploadメソッドを呼び出す前にContentType
プロパティを設定するだけです。したがって、コードは次のようになります。
// Save image
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blah.jpg");
blockBlob.Properties.ContentType = "image/jpg";
blockBlob.UploadFromByteArray(byteArrayThumbnail, 0, byteArrayThumbnail.Length);
これでうまくいくはずです。
Properties
に変更を加えたら、実際にそれらの変更を保存するために CloudBlockBlob.SetProperties() を呼び出す必要があります。
LINQ-to-Entitiesに似たものと考えてください。ローカルオブジェクトに必要な変更を加えることができますが、SaveChanges()
を呼び出すまで、実際には何も保存されません。
azure Blob SDKの新しいバージョンでは、これは機能しなくなりました。
これは私のために働きました:
CloudBlockBlob blockBlob = cloudBlobContainer.GetBlockBlobReference(blobName);
blockBlob.Properties.ContentType = contentType;
await blockBlob.SetPropertiesAsync();
明らかに、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();