Spring @RequestParam不使用HTML FormData

时间:2015-11-11 19:17:13

标签: spring form-data

我想使用angularjs作为前端进行文件上传,将Spring Rest作为后端。这是我的前端代码:

var data = evt.target.result;
        var formData = new FormData();

        formData.set("fileId", 1);
        formData.set("file", data);

        $http({method: "POST", url: "/file", data: formData, headers : {"Content-Type": undefined}, transformRequest: angular.identity}).success(function() {
            console.log("hi");
        }).error(function(reason) {
            console.log(reason);
        });

这是我的后端代码:

@RequestMapping(value = "/file", method = POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Void> uploadFile(@RequestPart("file") MultipartFile file) {

我认为我的代码应该正常运行,但事实上,我一直收到错误400,说&#34;必需的请求部分&#39;文件&#39;不存在&#34;

任何想法?感谢。

以下是来自萤火虫的数据:

-----------------------------5045635351933894389797998578
Content-Disposition: form-data; name="fileId"

1
-----------------------------5045635351933894389797998578
Content-Disposition: form-data; name="file"

%PDF-1.7
%äãÃÃ’
4 0 obj
<</Type/XObject
/Subtype/Form
/FormType 1
/Matrix[1 0 0 1 0 0]
/BBox[0 0 612 792]
/Resources<</ExtGState<</GS0 5 0 R>>/ProcSet[/PDF/ImageC]/Properties<</MC0 6 0 R>>/XObject<</Im0 7 0
 R>>>>/Filter/FlateDecode/Length 343>>
stream
H‰”“ÃNÃ0†ïy
¿@SDZ“øʆ&;ð
-----------------------------5045635351933894389797998578--

我们可以清楚地看到参数名称,一个是fileId,另一个是文件。

1 个答案:

答案 0 :(得分:2)

我解决了它!错误是我试图上传文件的数据,而不是整个文件,其中包括数据,文件名和其他有用的属性。前面的代码如下:

var data = evt.target.result;
        var formData = new FormData();

        formData.append("fileId", 1);
        formData.append("file", data);

我将其更改为以下内容:

var formData = new FormData();

        formData.append("fileId", 1);
        formData.append("file", file);

文件变量引用HTML5文件对象,而前一个引用文件的二进制数据。