一开始通过请求的方式写了个下载文件的工具代码,可以参考下面链接 https://blog.csdn.net/z2014ypd/article/details/88417757 这种方式在项目打包发布后,获取的文件是提示损坏,无法打开的,原因就是项目打包,不会将resources文件夹下面的资源一起打包,而且打包的时候maven会对文件进行压缩,这就导致请求响应访问错误,文件自然就是损坏的。 解决资源打包以及压缩问题,只需要在打包的pom里面增加配置
<build>
<plugins>
//这个插件是为了防止打包的时候压缩xlsx类型的文件
<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>
//这个是说明文件放的地址,资源文件位置,打包的时候才会把资源文件打包放到jar包里面
<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包内的文件到本地打开了
|