Spring 4与AngularJS文件上传报错:当前请求非多部分请求
解决Spring 4 + AngularJS 文件上传时的
org.springframework.web.multipart.MultipartException 错误 我之前在做Spring+AngularJS项目时也踩过这个坑,结合你的场景,咱们一步步排查解决这个"The current request is not a multipart request"的问题:
一、先盯紧前端请求的核心配置
这是最容易出错的环节,AngularJS默认的请求逻辑不会自动适配multipart表单,必须手动调整:
1. HTML表单的编码类型
确保你的上传表单明确设置了enctype="multipart/form-data",这是浏览器识别multipart请求的基础:
<form id="uploadForm" enctype="multipart/form-data"> <input type="file" name="file" ng-model="file" /> <button ng-click="uploadFile()">上传文件</button> </form>
哪怕用Angular的ng-submit绑定提交逻辑,这个属性也不能少
2. AngularJS控制器的请求写法
别手动设置Content-Type为multipart/form-data!手动设置会丢失关键的boundary信息,正确的做法是让浏览器自动生成请求头:
app.controller('UploadController', ['$scope', '$http', function($scope, $http) { $scope.uploadFile = function() { var formData = new FormData(); // 这里的"file"要和Spring控制器接收的参数名完全一致 formData.append('file', $scope.file); $http.post('/upload', formData, { transformRequest: angular.identity, headers: {'Content-Type': undefined} // 关键:让浏览器自动处理请求头 }).then(function(response) { console.log('上传成功啦'); }, function(error) { console.error('上传失败', error); }); }; }]);
划重点:headers: {'Content-Type': undefined} 是核心,Angular会根据FormData自动生成带boundary的合法multipart请求头
二、检查Spring的配置(application-servlet.xml)
确保你配置的CommonsMultipartResolver的id是multipartResolver——Spring默认只会识别这个id的multipart解析器:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置最大上传文件大小,比如10MB --> <property name="maxUploadSize" value="10485760" /> <!-- 临时文件存储目录,要确保这个目录存在且有读写权限 --> <property name="uploadTempDir" value="file:/tmp/spring_upload_temp" /> </bean>
你引入的commons-fileupload-1.3.2和commons-io-2.4版本和Spring4是兼容的,这点没问题
三、核对Spring控制器的接收代码
确保控制器方法的参数注解和前端传的参数名完全匹配:
@Controller public class FileUploadController { @RequestMapping(value = "/upload", method = RequestMethod.POST) public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { try { // 这里替换成你的文件存储逻辑,比如写入指定目录 byte[] fileBytes = file.getBytes(); Path savePath = Paths.get("/your/upload/destination/" + file.getOriginalFilename()); Files.write(savePath, fileBytes); return new ResponseEntity<>("文件上传成功", HttpStatus.OK); } catch (IOException e) { e.printStackTrace(); return new ResponseEntity<>("文件保存失败", HttpStatus.INTERNAL_SERVER_ERROR); } } else { return new ResponseEntity<>("不能上传空文件", HttpStatus.BAD_REQUEST); } } }
四、最后排查几个容易忽略的点
- 请求方式必须是POST:GET请求无法处理multipart类型的上传
- 临时目录权限:Spring的multipart解析器需要读写临时目录的权限,检查你配置的目录或者默认临时目录是否存在且有权限
- 依赖包是否生效:确认commons-fileupload和commons-io的jar包已经被打包到项目的WEB-INF/lib目录下
按上面的步骤逐一排查,应该就能解决这个"不是multipart请求"的错误了。
内容的提问来源于stack exchange,提问作者yogita Patil
相关产品推荐
相关产品推荐

