美文网首页
Springboot打成jar包发布,excel模板文件下载处理

Springboot打成jar包发布,excel模板文件下载处理

作者: 轻轻敲醒沉睡的心灵 | 来源:发表于2020-08-13 10:08 被阅读0次

    excel文件是本来存在的,放在resources/static目录下,提供接口给前端下载。下载的文件用office打开时,一直提示如下:

    打开提示
    虽然最终能打开,但是.................
    这种情况在本机eclipse中测试的时候都没有问题,只有打成jar包后才出现。度娘查到各种各样的说法,比如修改response请求回应头,比如使用ByteArrayHttpMessageConverter,比如修改文件读取方式,没点屁用!!

    0.原来下载用的方法:文件输出流方式下载(下载的文件打开提示错误的)

    package com.test.demo.service.impl;
    
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Service;
    
    import com.test.demo.service.DownLoadService;
    
    import cn.hutool.core.io.FileUtil;
    import cn.hutool.core.util.URLUtil;
    
    @Service
    public class DownLoadServiceImpl implements DownLoadService {
    
        @Override
        public void excelTemplateDownLoad(HttpServletRequest req, HttpServletResponse res) throws Exception {
            String path = "static/excel/test.xls";
            String fileName = path.substring(path.lastIndexOf("/") + 1);
            String userAgent = req.getHeader("User-Agent");
            // 针对IE或者以IE为内核的浏览器:
            if(userAgent.contains("MSIE")||userAgent.contains("Trident")) { 
                fileName = URLUtil.encode(fileName,"UTF-8");
            }else {
                // 非IE浏览器的处理:
                fileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
            }
            res.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName));
            res.setContentType("application/vnd.ms-excel; charset=utf-8");
            res.setCharacterEncoding("UTF-8");
            // 读取服务器端模板文件
           InputStream inputStream = FileUtil.getInputStream(path);
           // 将流中内容写出去 
           OutputStream outputStream = res.getOutputStream();
           byte[] buffer = new byte[1024];
           int len;
           while ((len = inputStream.read(buffer)) != -1) {
               outputStream.write(buffer, 0, len);
           }
           inputStream.close();
           outputStream.close();
        }
    }
    

    解决办法1:使用spring boot 静态资源下载的方式;这种方式下不需定义接口,权限等问题不可控(未测试,这个方法是借鉴网上的,顺便记录下来)

    将资源文件放到resource/static目录下,启动服务,使用 IP:端口/文件路径 下载即可;这种方案下,需要将pom文件下的resource.filtering要设置为false,打成jar之后,也是正常可用的;

    <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.*</include>
                    </includes>
                    <filtering>false</filtering>    
                </resource>
                <resource>
                    <directory>src/main/webapp</directory>
                    <includes>
                        <include>**/**</include>
                    </includes>
                </resource>
            </resources>
     </build>
    

    解决办法2:使用文件输出流的方式下载,接口实现过程,使用POI的Workbook输出流(我用的这个办法,现在下载下来的excel不提示错误了)

    和原来的方法差不多,只是文件用POI的XSSFWorkbook(HSSFWorkbook)处理了一下,流中写出的是HSSFWorkbook对象

    public void downDeviceManagementTemplate(HttpServletRequest req, HttpServletResponse res) throws IOException {
            String path = "static/excel/test.xls";
            String fileName = path.substring(path.lastIndexOf("/") + 1);
            // 读取服务器端模板文件
            InputStream inputStream = FileUtil.getInputStream(path);
            // 转为POI的Workbook输出流,这样下载后 打开不报错,直接输出  流 的话,打开excel可能提示错误
            @SuppressWarnings("resource")
            HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
            String userAgent = req.getHeader("User-Agent");
            // 针对IE或者以IE为内核的浏览器:
            if(userAgent.contains("MSIE")||userAgent.contains("Trident")) { 
                fileName = URLUtil.encode(fileName,"UTF-8");
            } else {
                // 非IE浏览器的处理:
                fileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
            }
            res.setHeader("Content-disposition", "attachment; filename=" + fileName);
            res.setContentType("application/vnd.ms-excel; charset=utf-8");
            res.setCharacterEncoding("UTF-8");
            // 将流中内容写出去 
            OutputStream outputStream = res.getOutputStream();
            workbook.write(outputStream);
            outputStream.flush();
            outputStream.close();
        }
    

    PS:代码中用到的FileUtil工具类用的是 hutool工具包中的

    相关文章

      网友评论

          本文标题:Springboot打成jar包发布,excel模板文件下载处理

          本文链接:https://www.haomeiwen.com/subject/tdxbdktx.html