Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 489|回复: 0

JAVA文件下载功能问题解决日志

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-8-31 12:00:57 | 显示全部楼层 |阅读模式

      今天给报告系统做了个下载功能,遇到了挺多问题,通过查资料一一解决了。

    1、首先遇到的问题是:java后台的输出流输出之后,没有任何报错,浏览器端不弹出保存文件的对话框,原本是ajax请求到后台的controller方法中添加了下载的方法,type和async两个参数的四种组合都不行,弃用ajax,用window.location.href='file/download?path='+file;重新发一个新的下载请求之后,保存对话框终于弹出。

    2、弹出之后,发现文件名乱码,后台的解决方案代码如下:

          private static final String CHARSET = "utf-8";

    String agent = request.getHeader("User-Agent").toLowerCase(); if (agent != null && (agent.indexOf("msie") != -1 || (agent.indexOf("rv") != -1 && agent.indexOf("firefox") == -1))) { fileName = URLEncoder.encode(file.getName(), "UTF-8"); } else { fileName = new String(file.getName().getBytes(CHARSET), "ISO8859-1"); }

    3、后台一直在报错getWriter() has already been called for this response,通过报错内容大概可以看出ServletOutputStream out = response.getOutputStream();这个应该是个单例的,但是又没有发现别的地方在调用这个方法获取输出流,仔细测试发现,每次把所有的请求全部关闭之后,第一次不会出问题,之后再请求就会报错,把后面的out.close();注释掉,报错就解决了。

    4、前台拼文件路径的方法

                    var file;
                    var path = $("#lujing").val();
                    if(path.lastIndexOf('\\')!=path.length-1){
                        //console.info("不以斜杠结尾");
                        file = $("#lujing").val() + "\\" + $("#city").val() + "市" + $("#year1").val()
                        + $("#month1").val() + "电商数据分析报告.doc";
                    } else {
                        //console.info("以斜杠结尾");
                        file = $("#lujing").val() + $("#city").val() + "市" + $("#year1").val()
                        + $("#month1").val() + "电商数据分析报告.doc";
                    }
                    
                    window.location.href='file/download?path='+file;

    5、导出controller

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    /**
     * @author 作者 Jeffy
     * @version 
     * 
     */
    @Controller  
    public class FileController{
        //Spring这里是通过实现ServletContextAware接口来注入ServletContext对象  
    
        private static final String CHARSET = "utf-8";
        @RequestMapping("/exportreport/file/download")  
        public static void fileDownload(HttpServletResponse response, HttpServletRequest request,
                String path) throws UnsupportedEncodingException{
    
            File file = new File(path);
            String fileName;
            String agent = request.getHeader("User-Agent").toLowerCase();
            if (agent != null && (agent.indexOf("msie") != -1 ||   
                    (agent.indexOf("rv") != -1 && agent.indexOf("firefox") == -1))) {
                fileName = URLEncoder.encode(file.getName(), "UTF-8"); 
            } else {  
                fileName = new String(file.getName().getBytes(CHARSET), "ISO8859-1");
            }
    
    //        response.reset(); //非常重要
            //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
            response.setContentType("multipart/form-data");
            response.setContentType("application/OCTET-STREAM;charset=UTF-8");
            //2.设置文件头:最后一个参数是设置下载文件名(假如我们叫a.pdf)
            response.setHeader("Content-Disposition", "attachment;fileName="+fileName);
            ServletOutputStream out;
    
            try {  
                FileInputStream inputStream = new FileInputStream(file);
      
                //3.通过response获取ServletOutputStream对象(out)  
                out = response.getOutputStream();  
      
                int b = 0;  
                byte[] buffer = new byte[512];  
                while ((b = inputStream.read(buffer)) != -1){  
                    //4.写到输出流(out)中  
                    out.write(buffer,0,b);  
                }  
                inputStream.close();  
    //            out.close();  
    //            out.flush();  
    
            } catch (IOException e) {
                e.printStackTrace();  
            }  
        }  
    
    }

    以上便是遇到的java文件下载功能全部问题,可能还有暂时没有测试出的问题,后续发现问题及时更新,也请大家多多批评指正。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 00:31 , Processed in 0.089561 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表