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

使用ASP.NET Web API 2上传Azure Blob时Content-Type异常求助

解决Azure Blob上传后Content-Type异常无法预览的问题

我一眼就看出问题所在了——你上传Blob的时候没有设置正确的Content-Type属性,而且还误用了服务器临时文件的文件名作为Blob名称(就是那个类似BodyPart_xxxxxx的临时文件名),这两个问题加起来就导致了你的图片无法在资源管理器中正常打开。

问题根源拆解

  • Blob名称错误:fileData.LocalFileName是服务器本地临时文件的路径,不是用户上传的原始文件名,所以你在Blob里看到的都是一串乱码文件名,完全看不出是图片。
  • Content-Type未设置:Azure Blob默认会把未指定类型的文件设为application/octet-stream,浏览器/资源管理器识别不了这个类型,自然无法直接打开预览。

修复方案

我们需要做这几个关键修改:

  1. 从请求中获取用户上传的原始文件名
  2. 根据原始文件名获取对应的MIME类型(Content-Type)
  3. 上传Blob时手动设置Content-Type属性

修改后的完整代码

public class DocumentsController : ApiController 
{ 
    private const string CONTAINER = "documents"; 

    // POST api/<controller> 
    public async Task<HttpResponseMessage> Post() 
    { 
        var context = new StorageContext(); 

        // Check if the request contains multipart/form-data. 
        if (!Request.Content.IsMimeMultipartContent()) 
        { 
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
        } 

        // Get and create the container 
        var blobContainer = context.BlobClient.GetContainerReference(CONTAINER); 
        blobContainer.CreateIfNotExists(); 

        string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
        var provider = new MultipartFormDataStreamProvider(root); 

        try 
        { 
            // Read the form data and return an async task. 
            await Request.Content.ReadAsMultipartAsync(provider); 

            // 遍历上传的文件,修复文件名和Content-Type设置
            foreach (var fileData in provider.FileData) 
            { 
                // 1. 获取用户上传的原始文件名(去掉前后的双引号)
                var originalFileName = fileData.Headers.ContentDisposition.FileName.Trim('"');
                // 2. 根据文件名获取对应的MIME类型
                var contentType = System.Web.MimeMapping.GetMimeMapping(originalFileName);
                
                // 使用原始文件名创建Blob引用
                var blob = blobContainer.GetBlockBlobReference(originalFileName);
                // 3. 设置Blob的Content-Type属性
                blob.Properties.ContentType = contentType;

                using (var filestream = File.OpenRead(fileData.LocalFileName)) 
                { 
                    blob.UploadFromStream(filestream); 
                } 
                File.Delete(fileData.LocalFileName); 
            } 

            return Request.CreateResponse(HttpStatusCode.OK); 
        } 
        catch (System.Exception e) 
        { 
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e); 
        } 
    } 
}

关键修改说明

  • 获取原始文件名:通过fileData.Headers.ContentDisposition.FileName拿到用户上传的真实文件名,用Trim('"')去掉默认带的双引号(比如"my-photo.jpg"变成my-photo.jpg)。
  • 获取MIME类型:利用System.Web.MimeMapping.GetMimeMapping()方法,根据文件名后缀自动匹配正确的Content-Type(比如.jpg对应image/jpeg,.png对应image/png)。
  • 设置Content-Type:在上传流之前,给blob.Properties.ContentType赋值,确保Azure Blob存储正确的文件类型。

这样修改后,你上传的Blob会使用原始文件名,并且带有正确的Content-Type,就能在Azure存储管理器或者浏览器里直接预览了。

内容的提问来源于stack exchange,提问作者ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:31:30