Spring Boot中的文件上传进度

4
在Spring Boot中上传文件可以使用如下代码:
@PostMapping("/")
public String handleFileUpload(@RequestParam("file") MultipartFile file,
    RedirectAttributes redirectAttributes) {

    storageService.store(file);
    redirectAttributes.addFlashAttribute("message",
        "You successfully uploaded " + file.getOriginalFilename() + "!");

    return "redirect:/";
}

它运行良好。

我的问题是如何扩展此代码以在上传过程中获取某种更新。例如:每完成10%的上传,一个事件。 是否有任何机制可以在上传期间创建这些事件?我可以覆盖一些内部Spring方法使其工作吗?


我恐怕这是不可能的。例如,这就像从一个位置复制并粘贴到另一个位置。粘贴可能需要更多的时间,因为它是一个写操作,在此期间如果源发生改变,当前的粘贴过程将不会意识到它。你必须重新上传那个文件。 - gramcha
当然,但在复制粘贴过程中,您可以看到复制的进度条。我正在寻找类似于这种情况的东西。只是从后端完成,而不是像我找到的所有教程中那样从前端完成。 - Marcin Szymczak
我认为你必须在这里开发自己的逻辑。 - Mehraj Malik
1个回答

1

要获取进度更新回调,请将以下bean添加到您的应用程序中:

@Bean(name = "multipartResolver")
public CommonsMultipartResolver createMultipartResolver() {

  final CommonsMultipartResolver cmr = new CommonsMultipartResolver();

  cmr.setMaxUploadSize(10000000); // customize as appropriate
  cmr.setDefaultEncoding("UTF-8");  // important to match in your client
  cmr.getFileUpload().setProgressListener(
      (long pBytesRead, long pContentLength, int pItems) -> {
        // insert progress update logic here
      });

  return cmr;
}

同时,将以下属性添加到您的应用程序属性中:
spring.http.multipart.enabled = false

注意:你的客户端应用程序必须与预期的内容编码(在此示例中为UTF-8)匹配。如果不匹配,则将使用临时的FileUpload对象,而不是我们在上面代码中自定义的对象。这可能是CommonsFileUploadSupport.java中的一个错误,因为它将原始FileUpload的所有其他成员复制到临时对象中,省略了监听器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接