如何实现多个文件上传功能,每个文件在Spring Boot中都有自己的额外字段(例如comment,documentType)?
此答案可能相关,但仅适用于单个文件: Spring boot controller - Upload Multipart and JSON to DTO
答案 0 :(得分:0)
您可以在POST
有效负载中编码多个请求部分,并使用Spring Boot处理这些请求部分。
假设您需要为每个文件传递两件事:
Blob
和文件内容metadata
-一个可以容纳任何内容的对象-标题/注释-您可以为其命名。您可以使用任何东西来模拟FormData
参数,这在TypeScript中:
假设文档看起来像这样:
export interface NewDocument {
title: string,
comment: string,
author: string,
file: File
}
因此FormData的生成可能像这样:
private getFormData(doc: NewDocument): FormData {
let formData: FormData = new FormData();
const json: Blob = new Blob([JSON.stringify(doc)], {type: 'application/json'});
formData.append('metadata', json); //adding the metadata
const blob: Blob = new Blob([doc.file[0]], {type: doc.file[0].type});
formData.append('file', blob); //adding the file contents
return formData;
}
然后您可以POST
将表单数据发送到给定的端点。
您可以在请求中指定所需的其他RequestParts
@PostMapping
public ResponseEntity<Void> uploadFile(@RequestPart("metadata") FileMetadata metadata,
@RequestPart("file") MultipartFile file) {
//process
}
FileMetadata
是自定义Java POJO,您可以在其中反序列化FrontEnd NewDocument
的JSON表示形式
您应该可以将其转换为倍数版本。
@PostMapping
public ResponseEntity<Void> uploadFile(@RequestPart("metadata") FileMetadata[] metadatas,
@RequestPart("file") MultipartFile[] files) {
//process
}
现在的问题是如何识别哪个元数据用于哪个文件。
一种简单的方法是在元数据对象中编码文件名并将其用于映射。
答案 1 :(得分:0)
HTML边
<input id="files" type="file" name="files[]" multiple />
上传
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<script type="text/javascript">
function uploadFiles(){
var form = new FormData();
var i=0;
$.each($("input[type='file']")[0].files, function(i, file) {
form.append('file', file);
form.append('extradata','ola'+i);
i++;
});
// send form data with ajax
$.ajax({
type: 'POST',
url: '/uploadFiles',
cache: false,
contentType: false,
processData: false,
data : form,
success: function(result){
console.log(result);
alert('upload success');
},
error: function(err){
console.log(err);
}
})
}
</script>
和服务器端
@PostMapping("/uploadFiles")
public String uploadFiles(@RequestParam("file") MultipartFile[] files,
@RequestParam("extradata") String[] extras) throws Exception {
int i = 0;
Files.createDirectories(Paths.get("./uploaded/"));
for (MultipartFile f : files) {
Files.copy(f.getInputStream(), Paths.get("./uploaded/" + extras[i] + f.getOriginalFilename()));
i++;
}
return "success";
}
您可以在https://github.com/ozkanpakdil/spring-examples/tree/master/demoMultiFileUpload
中找到运行示例