新款 Azure .NET SDK 如何設定 Content-Type

  • 2020 年 2 月 11 日
  • 筆記

導語

前不久我寫了一篇《嘗鮮新版 Azure .NET SDK》之後,使用了一段時間發現沒爆,於是今天決定把部落格的圖片存儲從舊版 SDK 遷移到新版 SDK,結果小收福報。

Content-Type

上傳到 Azure Blob 的文件必須設置正確的 Content-Type (Mime Type),要不然就會加班收福報,曾經在我的《.NET Core 批量重置 Azure Blob Storage 的 mime type》解釋過。因此,以下程式碼需要遷移到新版SDK。

var blockBlob = _container.GetBlockBlobReference(fileName);

// Why .NET Core doesn't have MimeMapping.GetMimeMapping()

string extension = Path.GetExtension(blockBlob.Uri.AbsoluteUri);

switch (extension.ToLower())

{

case ".jpg":

case ".jpeg":

blockBlob.Properties.ContentType = "image/jpeg";

break;

case ".png":

blockBlob.Properties.ContentType = "image/png";

break;

case ".gif":

blockBlob.Properties.ContentType = "image/gif";

break;

default:

break;

}

await using (var fileStream = new MemoryStream(imageBytes))

{

await blockBlob.UploadFromStreamAsync(fileStream);

}

新版 SDK 的上傳方法很簡單,根據 GitHub 的 Readme,一般是這樣的:

// Get a reference to a blob named "sample-file" in a container named "sample-container"

BlobClient blob = container.GetBlobClient(blobName);

// Upload local file

blob.Upload(filePath);

傳送門:https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Azure.Storage.Blobs/README.md#uploading-a-blob

那麼 ContentType 去哪兒了?我一開始以為它現在能自動根據拓展名設置 ContentType,結果傳上去的全是 application/octet-stream,爆到天上去。

新版 SDK 的文檔和教程很少,Bing 沒有什麼卵用。996了半小時後,最終在官網的 API Reference 里找到了疑似對象:BlobHttpHeaders.ContentType

傳送門:https://docs.microsoft.com/en-us/dotnet/api/azure.storage.blobs.models.blobhttpheaders.contenttype?WT.mc_id=AZ-MVP-5002809&view=azure-dotnet

BlobClient Upload 方法正好有個重載,能接受 BlobHttpHeaders 參數,於是我實驗了一下,居然成功了:

BlobClient blob = _container.GetBlobClient(fileName);

// Why .NET Core doesn't have MimeMapping.GetMimeMapping()

var blobHttpHeader = new BlobHttpHeaders();

string extension = Path.GetExtension(blob.Uri.AbsoluteUri);

switch (extension.ToLower())

{

case ".jpg":

case ".jpeg":

blobHttpHeader.ContentType = "image/jpeg";

break;

case ".png":

blobHttpHeader.ContentType = "image/png";

break;

case ".gif":

blobHttpHeader.ContentType = "image/gif";

break;

default:

break;

}

await using (var fileStream = new MemoryStream(imageBytes))

{

var uploadedBlob = await blob.UploadAsync(fileStream, blobHttpHeader);

}

現在上傳到 Azure Blob 里的文件能夠獲得正確的 Content-Type 資訊。