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

时间:2011-03-31 20:36:41

标签: java jsp spring-mvc download

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

/media/files/files

在这个目录中我有各种不同的文件,.jpg,.doc。 .xls,.png等,并希望我能采用给定文件路径的最简单方法,从目录中检索它并将其发送回JSP,以便用户能够下载文件。我发现的信息似乎总是涉及从blob反序列化,从远程位置拉,或类似的东西到代码相当冗长的地方,我认为必须有一个相当简单的方法来做我想要的如果我在本地拥有这些文件并且它们是常规格式(不是在DB等中)

感谢任何建议

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

我把它放在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>

非常感谢任何建议

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

1 个答案:

答案 0 :(得分:2)

如果您不希望下载任何逻辑,只需在需要时由容器处理身份验证/授权内容,您就可以将这些文件作为静态资源使用。为了实现这一点,您只需要映射Spring DispatcherServlet以便它不会处理对/ media / files / 的请求,实现这一点的一个简单方法是将spring servlet映射到某些扩展名,如/ < /em>.html,或已映射到子目录而不是/ 。这样,容器将处理对/ media / 内容的请求,它只会提供静态文件。

如果你需要以某种方式干扰下载(例如,如果你在容器外处理auth东西,或者你想在每次下载之前或之后采取一些行动),那么你可以从你的弹簧控制器返回一个View在设置了适当的标题,如Content-Type,length,disposition等之后,它只是将请求的文件代理到输出流。我不知道任何这样的内置视图,但是很容易自己创建一个并且可能编写自己的ViewResolver,它将在/ media / whatever下返回该视图的文件名实例。

我希望这会有所帮助。