关于下载文件没有后缀名,使用rest传递地址的方法下载时没有文件后缀名的解决办法,包括传入参数的方法和rest地址传入参数的方法的不同之处

设定下载文件的功能的时候,如果不是从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")

运行结果:
在这里插入图片描述
你看,是不是带有后缀名了。也可以实现正常下载。

扫描二维码关注公众号,回复: 11584507 查看本文章

番外篇:什么是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,然后我们再运行一遍:
在这里插入图片描述

你看,后缀名不就出来了吗?

猜你喜欢

转载自blog.csdn.net/Andre_dong/article/details/107878589