设定下载文件的功能的时候,如果不是从JSP中传入文件名给Controller,而是从用户打开网页在网址中输入文件名的话,那就需要用一个注解,叫@PathVariable,插入的位置具体如下:
@RequestMapping("/download/{filename}")
public void download(@PathVariable String filename, HttpSession session, HttpServletResponse resp)
,插入了这个注解后,你可以直接在网址里里面输入/download/123.jpg(我的文件名为123.jpg),就可以实现直接跳转到页面的下载,但是注意一点,如果是在映射文件中
<mvc:view-controller path="/showFile" view-name="file"/>
这里打开JSP的地址,然后JSP页面中有一个带有URL的文字名:
<a href="${pageContext.request.contextPath}/file/download/123.jpg">使用rest风格</a>
你在网页中点击这个文字名,JSP就会把图片的名字传给Controller文件那边,由Controller文件进行读取文件和下载,但是使用rest方法进行下载文件的话,会出现这个问题
有没有发现,所需要下载的文件是没有后缀的,不仅如此,无论下载什么文件都没有后缀,这是为什么呢?
这是因为,如果你使用rest方法去下载文件的话,这个方法是会自动截取文件名的后缀的,也就是说在JSP的rest方法处它会默认截取掉文件名后缀
那应该怎么解决这个问题呢?
很简单,你把文件名写到前面来不就行了吗?
把代码改一下
<a href="${pageContext.request.contextPath}/file/123.jpg/download">使用rest风格</a>
这是JSP页面中的rest方法代码块修改结果
这是Controller文件的修改结果:
@RequestMapping("/{filename}/download")
运行结果:
你看,是不是带有后缀名了。也可以实现正常下载。
番外篇:什么是rest下载法
rest下载法就是把JSP页面中的下载方法改成
<a href="${pageContext.request.contextPath}/file/123.jpg/download">使用rest风格</a>
而正常的传入参数下载的方法为:
<a href="${pageContext.request.contextPath}/file/download?filename=123.jpg">下载文件:使用请求参数传递文件名</a>
它们之间的不同之处在于一个是有问号传入参数,一个是没有问号直接把文件名作为地址传进去,而且rest方法的Controller文件的注释@RequestMapping方法中地址有占位符让参数传进去
@RequestMapping("/{filename}/download")
而且方法那里多了一个@PathVariable注释能够让地址中的文件名传进来
public void download(@PathVariable String filename, HttpSession session, HttpServletResponse resp)
而正常传入参数的方法是这样的:
@RequestMapping("/download")
public void download(String filename, HttpSession session, HttpServletResponse resp)
在刚刚说的rest方法配置下载功能的时候,只说了一种方法,就是把文件名放到前面去,但是如果我们硬是要想把文件名放到最后面去,并且不想被系统截取文件后缀名,该怎么办?
首先,我们先把文件吧文件名恢复到最后面去(这是JSP页面)
<a href="${pageContext.request.contextPath}/file/download/123.jpg">使用rest风格</a>
Controller的RequestMapping注释地址也恢复一下(这是Controller文件)
@RequestMapping("/download/{filename}")
还有注意,@PathVarivable不用改,因为参数还是从地址传过来
public void download(@PathVariable String filename, HttpSession session, HttpServletResponse resp)
关键一步来了,看看我们本文没提到过的映射文件Springmvc.xml文件,配置Springmvc这个框架的时候,还记得需要6个配置步骤吗,其中的第二步,配置HandlerMapping映射处理器的时候,因为我们现在用的是<mvc:annotation-driven conversion-service="conversionService">
一步到位取代了第二步配置HanderMapping映射处理器和第三步HandlerAdapter处理器适配器(因为这个代码可以自动配置第二步和第三步),然而在第二步的HandlerMapping映射处理器当中,自动设定自动截取文件名后缀的方法为true,因此,我们需要把它改为false,具体需要怎么改呢?
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<!-- 文件下载时,配置不截取url后缀-->
<property name="useSuffixPatternMatch" value="false"/>
</bean>
把第二步配置HandlerMapping重新配置进去,并且在方法中加入property name,截取后缀名方法的value等于false,然后我们再运行一遍:
你看,后缀名不就出来了吗?