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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:50:18