当我使用
dropzone.js
上传许多文件时,出现问题。
我需要向
POST
请求添加更多参数,我已阅读 dropzonejs.com
上的文档和 github.com
上的 wiki,参数已添加到请求中。
问题是文件的默认参数是
files[0]
,files[1]
...(我将paramName
选项设置为files
),但我无法使用java spring mvc代码接收files
参数。
这是我的 spring mvc 控制器代码:
@RequestMapping("/upload")
public Map<String,Object> method(CaseInfo info,HttpServletRequest request,@RequestParam("files[]")MultipartFile[] files){
...
}
这是我的js核心代码:
this.on("sending", function(file, xhr, formData){
console.log("formData ->", formData);
var frm = $('#form');
var data = frm.serializeArray();
console.log('data ->', data);
for (var obj in data) {
formData.append(obj.name, obj.value);
}
});
控制器就是收不到文件参数,其他的名字是
undefined
,
我把for-in改成下面的,然后
undefined
问题就解决了。
但我不知道为什么...有人知道吗?
for (var i = data.length - 1; i >= 0; i--) {
var obj = data[i];
formData.append(obj.name,obj.value);
}
我通过覆盖源js代码解决了这个问题。
Dropzone.prototype._getParamName = function(n) {
if (typeof this.options.paramName === "function") {
return this.options.paramName(n);
} else {
// return "" + this.options.paramName + (this.options.uploadMultiple ? "[" + n + "]" : "");
return "" + this.options.paramName;
}
};
理解这是一个老问题,但我已经成功地将“发送”选项更改为“sendingmultiple”,然后传递一个仅返回“文件”的函数以与 spring 控制器签名匹配:
js
sendingmultiple: function(files, xhr, formData) {
// additional request paramter
formData.append('media', JSON.stringify(media));
for (const [key, value] of formData) {
console.log('key: ' + key + ' value: ' + value);
}
},
acceptedFiles: "image/*",
uploadMultiple: true,
paramName: function() { return "files"; }
java
@PostMapping("/user/media/upload")
@ResponseStatus(HttpStatus.CREATED)
public User uploadMedia(@RequestParam String media, @RequestParam("files") MultipartFile[] files) {
我找到了另一种方法来解决这个问题。我使用包装类并在此类中添加多部分变量列表。在控制器方法中,我捕获了这个包装类。
有这样的东西。
@PostMapping("/upload")
public String handleFileUpload(UploadFileRequestParam param) {
}
public class UploadFileRequestParam {
// files should be in the form data
private List<MultipartFile> files;
}