• Java文件流下载并提示文件不存在


    做文件下载功能的时候,一般使用流的形式下载文件,

    如果源文件不存在,下载页面可能就会没有提示,或者一片空白

    用户操作之后可能一头雾水,那如何友好提示呢?

    想到的有两种

    1.可以尝试下载一个名称为:文件不存在.txt 的文档,里面还可以补充说明信息,保证每次能下载到文件,避免没有响应到用户的情况。

    2.后台输出一段JavaScript脚本提示文件不存在或已经被删除。

    直接上代码

    前端只有给出一个超链接即可

    <a href="${pageContext.request.contextPath}/receipt/download?fileName=套路得人心.jpg">套路得人心.jpg</a>

    后端控制器代码

    /**
         * 下载发票
         * @param request
         * @return
         */
        @RequestMapping(value = "/receipt/download",method = RequestMethod.GET)
        public void downloadReceipt(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
            // 获得要下载的文件的名称
            String fileName = request.getParameter("fileName");
            File file = new File(receiptPath + fileName);
            if(file.exists()){
                try {
    
                    String userAgent = request.getHeader("User-Agent");
                    if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
                        //IE浏览器处理
                        fileName = java.net.URLEncoder.encode(fileName, "UTF-8");
                    } else {
                        // 非IE浏览器的处理:
                        fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
                    }
    
                    // 以流的形式下载文件。
                    InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
                    byte[] buffer = new byte[inputStream.available()];
                    inputStream.read(buffer);
                    inputStream.close();
                    // 清空response
                    response.reset();
                    // 设置response的Header
                    response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName));
                    response.addHeader("Content-Length", "" + file.length());
                    OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
                    response.setContentType("application/octet-stream");
                    outputStream.write(buffer);
                    outputStream.flush();
                    outputStream.close();
                }catch (IOException ex) {
                    log.error("下载文件出错:" + ex);
                }
            }else{
                try {
                    response.setContentType("text/html; charset=UTF-8"); //转码
                    PrintWriter out = response.getWriter();
                    out.flush();
                    out.println("<script defer='defer' type='text/javascript'>");
                    out.println("alert('文件不存在或已经被删除!');");
                    out.println("window.location='/AnnualStatistics/downloadList';");
                    out.println("</script>");
                } catch (IOException e) {
                    log.error("下载文件出错:" + e);
                }
            }
        }

    效果

  • 相关阅读:
    go多平台编译打包
    正则表达式
    Java 线程安全问题的本质
    Thread interrupt() 线程中断的详细说明
    git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks push -v --tags origin master:master Logon failed, use ctrl+c to cancel basic credential prompt.
    kafka 消费组功能验证以及消费者数据重复数据丢失问题说明 3
    kafka 副本机制和容错处理 -2
    Mat使用详解
    MySql Binlog 说明 & Canal 集成MySql的更新异常说明 & MySql Binlog 常用命令汇总
    ElasticSearch 集群基本概念及常用操作汇总(建议收藏)
  • 原文地址:https://www.cnblogs.com/liuxiutianxia/p/11139575.html
Copyright © 2020-2023  润新知