Java,Spring MVC,从服务器提取任何类型的文件(.png、.jpg、.pdf、.doc 等)并提供给用户下载的最简单方法?

标签 java jsp spring-mvc download

我一直在搜索这个问题,但我发现的信息对于我想要做的事情来说似乎过于复杂,或者涉及必须准确指定正在下载的文件类型并为此使用特定的 Java 类,我是想知道是否有一种方法不必这样做,并且能够使用一种方法来执行此操作,而不管文件类型如何,因为我没有生成文件,只是从目录中存在的位置获取它。我在本地文件夹中有一组文件,例如:

/media/files/files

在这个目录中我有各种不同的文件,.jpg,.doc。 .xls、.png 等,并且想要以最简单的方式获取给定的文件路径,从目录中检索它并将其发送回 JSP,以便用户能够下载该文件。我找到的信息似乎总是涉及从 blob 反序列化、从远程位置拉取或类似的代码相当长的地方,我认为必须有一种相当简单的方法来完成我想要做的事情考虑到我在本地有这些文件并且它们是常规范式(不在数据库中等)

如有任何建议,我们将不胜感激

编辑感谢科斯蒂,我认为我现在走在正确的道路上,但我在下面尝试了这个,但仍然无法访问该文件:

我已将其放入 tomcat/conf 中的 server.xml 文件中:

<Context path="/files" docBase="/media/files/" />

然后尝试访问 http://myip:8080/files/test.txt 处的文件但它不起作用,在我的 Spring web.xml 中,我唯一的 Servlet 映射是:

<servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/d2/*</url-pattern>
    </servlet-mapping>

非常感谢任何建议

已修复:忘记 Eclipse 中的 server.xml 覆盖了 tomcat 服务器中的 server.xml,这就是它无法正常工作的问题

最佳答案

如果您不希望在下载过程中包含任何逻辑,则可以简单地将文件作为静态资源提供,前提是身份验证/授权内容由容器在需要时处理。为此,您只需映射 Spring DispatcherServlet,以便它不会处理对/media/files/ 的请求,实现此目的的一种简单方法是将 spring servlet 映射到某些扩展名,例如/.html,或已映射到子目录而不是/。这样,容器将处理对/media/内容的请求,并且仅提供静态文件。

如果您需要以某种方式干扰下载(例如,如果您在容器外部处理身份验证内容,或者您​​想在每次下载之前或之后执行某些操作),那么您可以从 Spring Controller 返回一个 View在设置正确的 header (如内容类型、长度、配置等)后,它只是将请求的文件代理到输出流。我不知道有任何这样的内置 View ,但是您自己创建一个 View 很容易,也许可以编写自己的 ViewResolver,它将返回/media/whatever 下文件名的该 View 的实例。

我希望这会有所帮助。

关于Java,Spring MVC,从服务器提取任何类型的文件(.png、.jpg、.pdf、.doc 等)并提供给用户下载的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5506008/

相关文章:

Spring - JSP 表单 :input on jsp page error: jasperexception

java - 数据库详细信息未在 Spring-MVC 中显示

spring - 模板解析时发生错误。 (Spring Boot + Thymeleaf)

java - Spring 集成: Intercept channels Asynchronuously

java - Android Studio - MPAndroidChart 将用户输入添加到折线图

java - JApplet 中的 JLabel 和图像 - 图像未显示

java - 将表添加到java swing

java - 为什么不尝试 I/O 就不可能检测到 TCP 套接字已被对等方优雅地关闭?

java - 类的 EL 表达式

forms - JSP 表单 "action"可以采用什么值?