上传blockblob并设置contenttype

spo*_*rts 19 c# content-type azure azure-storage azure-storage-blobs

我正在使用Microsoft.WindowsAzure.Storage.*C#中的库.

这就是我将内容上传到存储的方式:

// 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 ***
Run Code Online (Sandbox Code Playgroud)

我上传到存储的所有内容都以内容类型"application/octet-stream"保存,即使我使用的值为"image/jpg"的setter(请参阅我的代码中的最后一行).

问题#1:为什么不使用ContentType setter?

问题2:如果我手动将内容类型更改为"image/jpg",使用Windows Azure管理门户,然后将文件的绝对URI复制到浏览器的地址字段,然后按回车键,则会下载jpg文件而不是显示.是不是应该显示这个mime类型而不是下载?我该如何改变?

Gau*_*tri 91

实际上,您不必调用SetProperties方法.要在上传blob时设置内容类型,只需ContentType在调用upload方法之前设置属性即可.所以你的代码应该是:

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

那应该是诀窍.

  • 实际上,这不是真的,我相信您可能会因为文件名带有扩展名而看到这种现象。如果您使用其他标识符作为Blob的名称(例如数据库密钥)或使用没有扩展名的名称,则不会出现此现象。 (2认同)

Nat*_*n A 22

进行任何更改后Properties,您必须调用CloudBlockBlob.SetProperties()来实际保存这些更改.

将其视为与LINQ-to-Entities类似的东西.您可以对本地对象进行任何更改,但在调用之前SaveChanges(),实际上不会保存任何内容.

  • 在创建时,不应使用`SetProperties`方法来更新blob. (2认同)
  • SetProperties应该在任何时候使用,无论是第一次创建还是更新。根据我的观察,如果您使用文件名(带有扩展名),则它将ContentType默认为与扩展名匹配的内容。如果要确保始终将其设置为所需的内容类型,我将(1)上传数据,(2)设置内容类型(3)调用SetProperties()https://azure.microsoft.com/ zh-CN / documentation / articles / storage-properties-metadata / (2认同)

rcr*_*ruz 13

使用新的 SDK Azure.Storage.Blobs

BlobHttpHeaders blobHttpHeaders = new BlobHttpHeaders();
blobHttpHeaders.ContentType = "image/jpg";
blobClient.SetHttpHeaders(blobHttpHeaders);
Run Code Online (Sandbox Code Playgroud)

  • 如果 blob 仅包含一件,则它会因 BlockBlobClient.UploadAsync(Stream, BlobUploadOptions, CancellationToken) 崩溃:状态:404(指定的 blob 不存在。)正确的方法是在调用 UploadAsync 之前设置 BlobUploadOptions.Headers。 (4认同)

Meh*_*ral 8

不幸的是,这里提供的答案目前都不适用于最新的 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);
Run Code Online (Sandbox Code Playgroud)