ASP.NET Web API 4对接Angular 2-rc4上传文件报mime multipart流意外结束错误
问题根因
- 前端提交的请求体格式完全不符合
multipart/form-data规范:你使用JSON.stringify()将上传对象序列化为JSON字符串作为请求体,但multipart/form-data要求使用带boundary分界的多段格式存储参数和文件,两者完全不兼容,后端解析时找不到对应分界符,直接判定流异常结束。 - 手动硬编码Content-Type头的boundary值:
multipart/form-data的boundary是浏览器生成、和请求体中的实际分界符严格对应的,你手动指定固定值后,和实际请求的分界符不匹配,后端按照你指定的boundary找不到请求结束标记,触发报错。 - Postman请求正常是因为Postman会自动处理FormData的请求格式和对应Content-Type头,不需要手动配置,所以格式完全符合后端要求。
- 你之前追加CRLF的方案无法生效,因为问题根源不在流结尾缺少换行,而是整个请求体的格式完全错误。
修复方案
前端代码修改(核心修复点)
废弃原来的JSON序列化和手动Content-Type配置,改用FormData对象封装上传内容:
// 1. 初始化FormData对象 const formData = new FormData(); // 2. 把原jobFilesUpload的业务参数逐个追加到FormData formData.append('OBPJobId', jobFilesUpload.OBPJobId); // 3. 追加要上传的文件,替换为你实际获取的文件对象即可 formData.append('uploadFile', 上传的文件对象, 原文件名); const fileHeaders = new Headers(); fileHeaders.append('Accept', '*/*'); // 注意:不要手动加Content-Type和Access-Control-Allow-Origin头,跨域头是后端返回的响应头,前端配置无效 // 直接传formData作为请求体,不需要序列化 this.authHttp.post(this.authService.apiUrl + "api/upload/" + jobFilesUpload.OBPJobId, formData, { headers: fileHeaders }).subscribe(/* 原有后续逻辑 */)
后端代码优化
你之前追加CRLF的代码完全可以删除,前端格式正确的场景下不需要额外处理流,直接用ASP.NET Web API原生逻辑读取即可:
// 原生读取上传文件示例 if (HttpContext.Current.Request.Files.Count > 0) { var uploadFile = HttpContext.Current.Request.Files[0]; // 在此处添加文件保存、处理逻辑 }
内容的提问来源于stack exchange,提问作者Corey James Carney
相关产品推荐
相关产品推荐

