【问题标题】:Can we calculate checksum of the file as it is being uploaded by the user in a Spring MVC application?我们可以计算用户在 Spring MVC 应用程序中上传文件时的校验和吗?
【发布时间】:2021-09-08 13:01:25
【问题描述】:

我有一个部署在 Apache Tomcat 9 Webserver 中的 Spring MVC 应用程序。是否可以在用户上传文件时计算校验和?如果我想这样做,我什至应该从哪里开始寻找?

具体来说,我知道我可以在 Spring MVC 的 @Controller 类中计算校验和。但是,此时文件已完全上传到临时文件上传目录。具体来说,我在询问是否有一种方法可以在上传/创建 MultipartFile 对象时计算各个部分的校验和。我是否必须覆盖 Apache Tomcat 行为?是否可以在不修改 Tomcat 源代码的情况下做到这一点?如果不是,这样修改Tomcat源代码的潜在影响是什么?

我不了解网络服务器的复杂性,如果有人能告诉我从哪里开始寻找,我将不胜感激。

【问题讨论】:

  • 你仍然需要整个有效载荷来计算校验和,那么增益是多少? MultipartFile 中也没有多个部分,Multipart 是关于由多个部分组成的请求(它可以包含多个文件或一个文件和一个表单)。
  • 你的最终目标是什么?为什么在文件存储到磁盘(或内存)后不能计算校验和?
  • 我假设(可能是错误地)Tomcat 必须在上传文件时管理文件的切片,并将信息传达回客户端,显示与上传相关的任何“上传进度条”。这意味着文件是分多个部分上传的。不是这样吗?
  • 最终目标/收益是在上传大文件时节省时间。目前,我们在单独的线程中计算校验和,但是如果文件保存在对象存储中,这会导致校验和不可用。理想情况下,我们希望在将文件上传到 Tomcat 时计算校验和,然后在 Spring 应用程序将其移动到对象存储时将该校验和用作元数据。这能回答你的问题吗?

标签: spring spring-mvc tomcat file-upload multipart


【解决方案1】:

是的,在获得所有文件内容之前,您无法计算校验和。您可以访问前端部分吗?如果有,您可以通过 Javascript 计算校验和并将该信息放入您的请求标头中。

但是在这种情况下,你可能无法在 Spring 中使用MultipartFile 组件,你可能需要直接使用 apache 上传库,你有更多的低级控制让你在开始获取之前读取 header文件内容流。

【讨论】:

  • 我确实可以访问前端部分。但是,我们必须允许上传大文件(根据最近的历史记录最大为 200GB)。这将如何影响您使用 javascript 计算校验和的想法?这可能会使速度较慢的计算机上的(旧)浏览器崩溃吗? *这是您提到的 Apache Upload 库:commons.apache.org/proper/commons-fileupload 吗?
  • 是的,commons-fileupload 被许多 servlet 容器用来解析multipart/form 请求(Tomcat 也有一个repackaged copy)。
  • @saquib-khan 你可以检查这个stackoverflow.com/questions/768268/…,你可以从那些建议的库中做简单的基准测试。但是,与您将整个 200GB 文件直接上传到服务器进行校验相比,它肯定会更好。
  • @saquib-khan 是的,apache commons-fileupload 是一个,我猜在内部 Spring MultipartFile 也使用它,但是要以更灵活和原生的特性使用它,你需要使用它直接而不是在 Spring MultipartFile 之上。
  • 我正在开发一个原型 Spring Boot 应用程序,我在其中禁用了 Spring 的 MultipartResolver 并尝试直接跟踪上传文件的流。我逐步浏览了 Spring 代码,并能够确认 Spring 确实使用 Apache Commons FileUpload 库来管理文件上传。所以,有一些好消息。一旦我有一个正常工作的原型,我会在这里更新。
猜你喜欢
  • 2020-11-19
  • 2018-10-22
  • 2018-08-14
  • 2011-05-03
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
相关资源
最近更新 更多