springMVC以附件形式下载PDF文件(解决了下载后文件格式出错无法打开的问题)

springMVC以附件形式下载PDF文件(解决了下载后文件格式出错无法打开的问题)
公司的上网行为管理系统项目有一个功能模块是统计报表,今天在完成这个功能的过程中碰到一个需求:将服务器上的PDF文件以附件的形式下载到本地。
马上想起springMVC提供了文件下载的功能,非常开心。然而,不碰上点bug不足以写博客啊!
先贴完整代码:

    public ResponseEntity download(String fileName)throws Exception{
        String filePath= ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/");
        File file=new File(filePath +File.separator+ fileName);
        org.springframework.http.HttpHeaders headers=new org.springframework.http.HttpHeaders();
        //解决中文乱码
        String downloadFileName=new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
        //文件名设置UTF-8编码,并以附件形式下载
        headers.setContentDispositionFormData("attachment", downloadFileName);
        //以PDF文件格式下载
        headers.setContentType((MediaType.parseMediaType("application/pdf")));
        return new ResponseEntity(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);
    }

照着书上的示例编写了一段代码,却发现下载下来的文件格式出错,无法打开??瞬间懵逼

马上分析代码可能出错的地方,首先是headers.setContentType((MediaType.parseMediaType(“application/pdf”)));这一句,刚开始找着书上写的是headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);,查了api文档和博客后发现这是二进制流数据,而我的应该是PDF格式才对,马上改正。
参考:Http请求中Content-Type讲解以及在Spring MVC中的应用

然而就这样却还是没解决问题,依旧很无奈,只得上网找找博客。很幸运,找到了类似的,试了试成功了。
关键就在于springMVC的配置文件里没有对ByteArray的消息转换器,加上后就成功解决问题了,开心。
上我的配置文件里面的相应代码:

    
    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">

            
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>

            
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
            bean>


            
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list><value>application/json;charset=UTF-8value>list>
                property>
                <property name="prettyPrint" value="false"/>
                <property name="objectMapper">  
                    <bean class="com._21cn.access.common.mapper.JsonMapper">bean>  
                property> 
            bean>
            
            <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                <constructor-arg>
                    <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                        <property name="streamDriver">
                            <bean class="com.thoughtworks.xstream.io.xml.StaxDriver"/>
                        property>
                        <property name="annotatedClasses">
                            <list>
                                <value>com._21cn.access.common.persistence.BaseEntityvalue>
                                <value>com._21cn.access.common.supcan.treelist.TreeListvalue>
                                <value>com._21cn.access.common.supcan.treelist.cols.Colvalue>
                                <value>com._21cn.access.common.supcan.treelist.cols.Groupvalue>
                            list>
                        property>
                    bean>
                constructor-arg>
                <property name="supportedMediaTypes" value="application/xml">property>
            bean>
        mvc:message-converters>
    mvc:annotation-driven>

参考:Spring MVC 文件下载最佳实践
SpringMVC中controller中方法返回类型为ResponseEntity乱码的问题

你可能感兴趣的:(JavaEE,web后台开发,前端知识,JAVA,J2EE常见框架SSM)