Java解决服务器下载excel文件提示损坏无法打开的问题

一开始通过请求的方式写了个下载文件的工具代码,可以参考下面链接
https://blog.csdn.net/z2014ypd/article/details/88417757
这种方式在项目打包发布后,获取的文件是提示损坏,无法打开的,原因就是项目打包,不会将resources文件夹下面的资源一起打包,而且打包的时候maven会对文件进行压缩,这就导致请求响应访问错误,文件自然就是损坏的。
解决资源打包以及压缩问题,只需要在打包的pom里面增加配置

<build>
        <plugins>
        		//这个插件是为了防止打包的时候压缩xlsx类型的文件,记得放在项目启动的那个层级pom里面
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <nonFilteredFileExtensions>
                        <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
                    </nonFilteredFileExtensions>
                </configuration>
            </plugin>
        </plugins>
        <resources>
        	//这个是资源文件配置信息,在启动时包含哪些文件,可以不用配置这个。若是无效再配置
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                    <include>**/*.yml</include>
                    <include>**/*.html</include>
                    <include>**/*.xlsx</include>
                </includes>
            </resource>
        </resources>
    </build>

进行配置之后,就是使用文件流的方式读取文件,进行下载。因为Linux都是读取文件流,这个方式之外的都不行,都会乱码。参考工具代码如下:

public static void download(HttpServletResponse response, String filePath, String fileName){ 
        try { 
            response.setHeader("content-type", "application/octet-stream");
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
            writeBytes(is, response.getOutputStream());
        }catch (Exception e) { 
           e.printStackTrace();
        }
    }

    private static void writeBytes(InputStream is, OutputStream os) { 
        try { 
            byte[] buf = new byte[1024];
            int len = 0;
            while((len = is.read(buf))!=-1)
            { 
                os.write(buf,0,len);
            }
        }catch (Exception e) { 
            e.printStackTrace();
        }finally { 
            if(is != null) { 
                try { 
                    is.close();
                } catch (IOException e) { 
                    e.printStackTrace();
                }
            }

            if(os != null) { 
                try { 
                    os.close();
                } catch (IOException e) { 
                    e.printStackTrace();
                }
            }
        }
    }

这样操作之后,就可以打包,下载jar包内的文件到本地打开了

    原文作者:小小志秩
    原文地址: https://blog.csdn.net/z2014ypd/article/details/123148832
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞