You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:06:28