如何实现多文件上传功能,在Spring Boot中每个文件都有自己的额外字段(如注释、文档类型)?
这个答案可能与此相关,但它仅适用于单个文件:Spring boot controller-将Multipart和JSON上载到DTO
您可以在有效负载中对多个请求部分进行编码,并使用Spring Boot进行处理。
假设您需要为每个文件传递两件事:
Blob
具有文件内容元数据
-一个可以保存任何内容的对象-标题/注释-您可以命名它。您可以使用任何东西来模拟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;
}
然后,您可以将表单数据发布到给定endpoint。
您可以指定请求中需要的不同请求部分
@PostMapping
public ResponseEntity<Void> uploadFile(@RequestPart("metadata") FileMetadata metadata,
@RequestPart("file") MultipartFile file) {
//process
}
这里是一个自定义Java POJO,您可以将前端的新文档的JSON表示反序列化到其中
您应该能够将其转换为倍数版本。
@PostMapping
public ResponseEntity<Void> uploadFile(@RequestPart("metadata") FileMetadata[] metadatas,
@RequestPart("file") MultipartFile[] files) {
//process
}
现在的问题是如何识别哪个元数据用于哪个html" target="_blank">文件。
一种简单的方法是将文件名编码到元数据对象中,并将其用于映射。
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
我是java新手,我在VSCODE上编码。我创建2.java文件,如下图所示: 这些是每个文件: Main.java:
寻找在Springboot应用程序中配置多个配置文件特定属性文件的最佳方法。下面是一个例子: -资源 · --application.properties · · · · · --德夫 --application-dev.properties --ldap-dev.properties --Quartz-Dev.Prope
问题内容: 我该怎么做? File1 看起来像这样: File2 看起来像这样: 我想做的是找到 字段 1,2和3 相同时在 File1 和 File2 中同时出现的行。 __ 有办法吗? 问题答案: 你可以试试看 输出 如果要省略不常见的行 输出
问题内容: 第二次输入后,我无法上传任何图像。我只能上传第一个输入。当添加另一个输入值时,将动态创建输入。下面是代码: 问题答案: 我制作并测试了一些代码示例,以便您可以了解问题所在。您有几处错误。我建议的第一件事实际上是使用jQuery。您的代码显然使用的是jQuery,但您可以使用各种可以简化的原始JS: 请注意,我在ajax URL中进行了硬编码。我用于测试的控制器名为Multi_uploa
问题内容: 这是我上传多个文件的代码: HTML代码: 密码: 但是它会上传单个文件,而不是多个文件。 问题答案: 在模板中,你需要在上传输入中添加属性: 然后在查看功能中,上传的文件可以通过列表获取。循环此列表并在每个项目上调用save()方法将它们保存在给定路径中: 此外,你可能需要使用secure_filename()来清洁文件名: 你也可以使用此方法生成随机文件名。 完整演示 视图: im
我试图理解以下文档: Transferutility.UploadDirectory null null null