上传blockblob并设置contenttype

时间:2014-07-07 23:47:01

标签: c# azure azure-storage content-type azure-storage-blobs

我正在使用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类型而不是下载?我该如何改变?

6 个答案:

答案 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();