.NET中如何自动设置上传至Blob Storage的文件ContentType?
问题描述
我的接口接收Base64编码的文件,请求格式如下:
{ "content": "base64String", "contentType": "application/pdf" }
将Base64字符串解码后写入MemoryStream,再通过Azure SDK for .NET上传到Azure Blob Storage,核心代码如下:
var fileByteArray = Convert.FromBase64String(fileRequest.FileContent); var stream = new MemoryStream(); stream.Write(fileByteArray, 0, fileByteArray.Length); stream.Position = 0; await _blobService.UploadAsync("containerName", stream, "fileName");
BlobService的UploadAsync实现:
var blobServiceClient = new BlobServiceClient("connectionString"); var blobContainerClient = blobServiceClient.GetBlobContainerClient("containerName"); var blobClient = blobContainerClient.GetBlobClient("fileName"); await blobClient.UploadAsync(fileStream, overwrite);
问题:上传后的Blob ContentType始终为application/octet-stream,但接收IFormFile的接口直接调用OpenReadStream()上传时,ContentType能被正确设置:
await _blobStorageService.UploadAsync("containerName", file.OpenReadStream(), "fileName");
已尝试方案:调用SetHttpHeadersAsync可以正确设置ContentType,但需要额外发起一次请求,效率较低,希望能像IFormFile上传那样,在上传流时自动设置ContentType。
解决方案
Azure Blob SDK的UploadAsync方法支持通过BlobUploadOptions参数在上传时直接指定HttpHeaders,无需额外调用接口。
1. 修改BlobService的UploadAsync方法,添加ContentType参数并配置上传选项
public async Task UploadAsync(string containerName, Stream fileStream, string fileName, string contentType) { var blobServiceClient = new BlobServiceClient("connectionString"); var blobContainerClient = blobServiceClient.GetBlobContainerClient(containerName); var blobClient = blobContainerClient.GetBlobClient(fileName); var uploadOptions = new BlobUploadOptions { HttpHeaders = new BlobHttpHeaders { ContentType = contentType }, // 如需覆盖已有Blob,可设置Overwrite = true // Overwrite = true }; await blobClient.UploadAsync(fileStream, uploadOptions); }
2. 调用上传方法时传入请求中的ContentType
var fileByteArray = Convert.FromBase64String(fileRequest.FileContent); // 直接用字节数组初始化MemoryStream,简化代码 using var stream = new MemoryStream(fileByteArray); await _blobService.UploadAsync("containerName", stream, "fileName", fileRequest.ContentType);
补充说明
IFormFile上传能自动识别ContentType,是因为IFormFile本身携带了文件的ContentType元数据,对应的上传逻辑内部已经读取该值并设置到了Blob的HttpHeaders中。而手动处理MemoryStream时,需要显式传递ContentType信息,否则SDK会默认使用application/octet-stream作为Blob的ContentType。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

