springboot类路径下excel、word文件下载为空和打不开记录

下载为空问题原因

下载为空这个原因很简单,新同事写的下载是这样写的,这种只能在本地用下,打包上线后就g了…

	  String fileName = "test.xlsx";
      String filePath = System.getProperty("user.dir")+"\\src\\main\\resource\\staitc\\"+fileName;
      File file = new File(filePath);
      FileInputStream fileInputStream = new FileInputStream(file);

      IOUtils.copy(fileInputStream, response.getOutputStream());
      response.setContentType("application/vnd.ms-excel;charset=UTF-8");
      response.setHeader("Content-disposition","attachment:fileName="+ URLEncoder.encode(fileName,"UTF-8"));
      response.setContentLength(fileInputStream.getChannel().size());

这个问题不大,只要换种方式读取类路径下文件即可,

InputStream resourceAsStream = this.getClass().getResourceAsStream("/static/" + fileName);

重点是下面这个打不开的问题

下载打不开问题现象和原因

在springboot工程的类路径下 /static/ 目录下创建了一个模板excel文件,比如 template.xlsx,写的文件下载功能将这个文件下下来的时候无法打开,提示内容已损坏。

一开始我以为是下载的写法有问题,比如响应头的content-type设置不对,content-length没有设置等问题导致的,最终发现是类路径下的excel编译后,会变成原来的大

出现原因是因为同事在 pom.xml 中配置了 配置了

    <profiles>
        <profile>
            <id>devid>
            <activation>
                <activeByDefault>trueactiveByDefault>
            activation>
            <properties>
                <profileActive>devprofileActive>
            properties>
        profile>
		// 省略几个 profile
        <profile>
            <id>prodid>
            <properties>
                <profileActive>prodprofileActive>
            properties>
        profile>

    profiles>


    <build>
        <resources>
            <resource>
                <directory>src/main/resourcesdirectory>
                <filtering>truefiltering>
            resource>
        resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-resources-pluginartifactId>
                <configuration>
                    <encoding>utf-8encoding>
                    <useDefaultDelimiters>trueuseDefaultDelimiters>
                configuration>
            plugin>
        plugins>
    build>

项目中按照不同的环境写了多个环境的配置文件

-application.yml
-application-dev.yml
-application-test.yml
-application-prod.yml

在 application.yml 中

spring:
	profiles:
		active: @profileActive@

此时因为pom配置的true,所以会导致其上配置的directory配置的路径下的资源都会经过maven一次处理,会将其内的@@包含的变量使用其定义的变量替换。

        <profile>
            <id>devid>
            <activation>
                <activeByDefault>trueactiveByDefault>
            activation>
            <properties>
                <profileActive>devprofileActive>
            properties>
        profile>

我这里配置的默认激活的是dev的配置,所以默认会使用 dev这个变量去覆盖所有类路径下的 @profileActive@,也即打包后的application.yml如下

spring:
	profiles:
		active: dev

而在处理excel、word等文件时,处理会其会变大且无法打开…不清楚怎么造成变大。

解决方案

在maven的 maven-resources-plugin 插件中添加配置 xlsx,表示不对xlsx为后缀的文件处理,点击该标签可以看到其默认已经对于图片文件进行处理,所以图片文件大小不会变。

Additional file extensions to not apply filtering (already defined are : jpg, jpeg, gif, bmp, png)
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<configuration>
    <encoding>utf-8encoding>
    <useDefaultDelimiters>trueuseDefaultDelimiters>
    <nonFilteredFileExtensions>xlsxnonFilteredFileExtensions>
configuration>

该配置项是个集合类型,可以以逗号分隔配置多个:比如 xlsx,docx

你可能感兴趣的:(spring,boot,excel,word)