我正在使用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”的setter(请参阅我的代码中的最后一行)。
问题#1:为什么不使用ContentType setter?
问题2:如果我手动将内容类型更改为“image / jpg”,使用Windows Azure管理门户,然后将文件的绝对URI复制到浏览器的地址字段,然后按回车键,输入jpg文件下载而不是显示。是不是应该显示这个mime类型而不是下载?我该如何改变?
答案 0 :(得分:75)
实际上您不必调用SetProperties方法。要在上传blob时设置内容类型,只需在调用upload方法之前设置ContentType
属性。所以你的代码应该是:
// Save image
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blah.jpg");
blockBlob.Properties.ContentType = "image/jpg";
blockBlob.UploadFromByteArray(byteArrayThumbnail, 0, byteArrayThumbnail.Length);
这应该可以解决问题。
答案 1 :(得分:20)
对Properties
进行任何更改后,您必须致电CloudBlockBlob.SetProperties()以实际保存这些更改。
将其视为与LINQ-to-Entities类似的东西。您可以对本地对象进行任何更改,但在调用SaveChanges()
之前,实际上不会保存任何内容。
答案 2 :(得分:7)
使用新的SDK Azure.Storage.Blobs
BlobHttpHeaders blobHttpHeaders = new BlobHttpHeaders();
blobHttpHeaders.ContentType = "image/jpg";
blobClient.SetHttpHeaders(blobHttpHeaders);
答案 3 :(得分:2)
不幸的是,此处提供的答案目前都不适用于最新的SDK(12.x。+)
对于最新的SDK,应通过BlobHttpHeaders
设置内容类型。
var _blobServiceClient = new BlobServiceClient("YOURCONNECTIONSTRING");
var containerClient = _blobServiceClient.GetBlobContainerClient("YOURCONTAINERNAME");
var blob = containerClient.GetBlobClient("YOURFILE.png");
var blobHttpHeader = new BlobHttpHeaders();
blobHttpHeader.ContentType = "image/png";
var uploadedBlob = await blob.UploadAsync(YOURSTREAM, blobHttpHeader);
答案 4 :(得分:0)
使用新版本的Azure Blob SDK,它不再有效。
这对我有用:
CloudBlockBlob blockBlob = cloudBlobContainer.GetBlockBlobReference(blobName);
blockBlob.Properties.ContentType = contentType;
await blockBlob.SetPropertiesAsync();
答案 5 :(得分:0)
显然最好像Gaurav Mantri的答案一样将其设置在创建上,如果您超出了这一点,并且需要在此处更新其他答案,则可能会使您感到困惑。
// 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();