使用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,浏览器/资源管理器识别不了这个类型,自然无法直接打开预览。
修复方案
我们需要做这几个关键修改:
- 从请求中获取用户上传的原始文件名
- 根据原始文件名获取对应的MIME类型(Content-Type)
- 上传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
相关产品推荐
相关产品推荐

