【问题标题】:Preserving file uploaded between views保留视图之间上传的文件
【发布时间】:2013-05-24 10:21:48
【问题描述】:

我在 Web 应用程序中使用 Spring MVC。我有一个允许用户上传文件的视图,并且我想在后续视图之间保留此文件,因此在控制器操作中我将其添加到下一个视图的模型中:

@RequestMapping("/loadFile")
    public String loadFile(
            Model model, 
            @RequestParam(required = true) CommonsMultipartFile uploadedFile,
HttpServletRequest request, HttpSession session) 
{
//some process
model.addAttribute("file", uploadedFile);
}

所以我的下一个视图应该是文件“可访问”。我试图复制我的文件上传视图的形式,然后将此文件值分配给文件输入,如下所示:

但这会分配org.springframework.web.multipart.commons.CommonsMultipartFile@57836c9d 或类似的值,但它不起作用。

您将如何在视图之间传播此文件?

【问题讨论】:

  • 您看到的是toString() 方法的值。在您的第二个视图中,您是否希望能够在输入字段中看到文件的路径?
  • 除了从第一个表单接收请求的控制器操作之外,我还想在其他控制器操作中访问此文件。
  • 为什么不将它保存到磁盘并在以后的请求中访问它?
  • 因为我冒着以后不删除它的风险,因为用户可以关闭当前页面然后我不知道什么时候删除它......
  • 您可以为此使用HttpSessionListener。将CommonsMultipartFile 存储在会话中。

标签: spring spring-mvc file-upload


【解决方案1】:

在您的 Spring 控制器中,您可以访问 HttpSession。该对象用于存储用户请求之间的信息。您可以使用 getAttribute(String)setAttribute(String, Object) 方法执行此操作。

如果您希望上传的文件在多个请求中可用,通过CommonsMultipartFile 接口,您可以将该对象存储在会话中。例如:

HttpSession session = ... // get the session, you have it in your handler method
CommonsMultipartFile uploadedFile = ...; // same as above
session.setAttribute("UPLOADED_FILE", uploadedFile); 

现在,只要您的会话有效,即。没有超时或者失效,任何Controller或者servlet都可以访问这个对象

CommonsMultipartFile uploadedFile = session.getAttribute("UPLOADED_FILE");

Spring 在@SessionAttributes 中有一个注解,你可以看一个例子here,但我不喜欢它。

您可能对用于管理会话中属性的HttpSessionListener 接口感兴趣。

【讨论】:

  • 我想到了那个解决方案,但我的文件可能非常大(最多 15mb)。这不会是个问题吗?
  • @MichelReap CommonsMultipartFile 实际上并不将字节存储在内存中,它具有对持久文件的引用(您的 serlvet 容器将其保存到磁盘)并在需要时检索字节,所以没有.
  • 我不知道,这听起来像是完美的解决方案。谢谢!
  • @MichelReap 您可以对 Apache Commons 如何处理多部分文件进行更多研究。您正在使用的 Spring 模块是建立在它之上的..
  • @SotiriosDelimanolis 在会话中发送多部分文件列表时出现错误你能帮我吗?!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 2011-07-09
  • 1970-01-01
  • 2012-12-31
  • 2018-08-11
相关资源
最近更新 更多