Java web文件下载及中文名显示问题

文件下载功能需求

  • 页面显示超链接
  • 点击超链接后弹出下载提示框
  • 完成文件下载

分析

  • 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则出现下载提示框。
  • 使用响应头设置资源打开方式。
    • content-disposition:attachment;filename=xxx

实现功能

  • 新建servlet获取get方法中的filename参数

    • //获取url中的参数
      String filename = req.getParameter("filename");
      
  • 判断获取到的参数是否为空

    • if (filename != null && !filename.equals("")) {}else{}
      
  • 如果为空,则输出提示

    • resp.setContentType("text/html;charset=utf-8");
      PrintWriter writer = resp.getWriter();
      writer.write("文件路径为空,请重新输入。");
      
  • 如果不为空,读取文件输出

    • //获取文件输入流
      FileInputStream fis = new FileInputStream(filepath);
      
      //设置头信息
      String mime = context.getMimeType(filename);
      resp.setContentType(mime);
      resp.setHeader("content-disposition", "attachment;filename="+filename);
      
      //获取Servlet输出流
      ServletOutputStream sos = resp.getOutputStream();
      //读取文件输入流中的数据,写入到Servlet输出流中
      byte[] ch = new byte[1024 * 10];
      int len = 0;
      while ((len = fis.read(ch)) != -1) {
      	esos.write(ch, 0, len);
      }
      fis.close();
      
  • 若文件读取发生io错误

    • //文件未读取成功
      try {
      	resp.setContentType("text/html;charset=utf-8");
      	PrintWriter writer = resp.getWriter();
      	writer.write("文件名错误,请重新输入。");
      } catch (IOException e1) {
      	e1.printStackTrace();
      }
      
  • 创建html文件

  • 创建输入框和按钮

    • <input id="input" type="text">
      <input id="button" type="button" value="下载文件">
      
  • 使用js实现点击按钮下载功能

    • var inputbox = document.getElementById("input");
      var button = document.getElementById("button");
      
      button.onclick = function () {
      	var inputValue = inputbox.value;
      	window.location.href = "filedownload?filename="+inputValue;
      }
      

完整代码

FileDownLoadServlet.java

@WebServlet("/filedownload")
public class FileDownLoadServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException {

        //获取url中的参数
        String filename = req.getParameter("filename");
        if (filename != null && !filename.equals("")) {
            ServletContext context = this.getServletContext();
            //查找文件
            String filepath = context.getRealPath("/file/" + filename);
            try {
                //获取文件输入流
                FileInputStream fis = new FileInputStream(filepath);

                //设置头信息
                String mime = context.getMimeType(filename);
                resp.setContentType(mime);
                resp.setHeader("content-disposition", "attachment;filename="+filename);

                //获取Servlet输出流
                ServletOutputStream sos = resp.getOutputStream();
                //读取文件输入流中的数据,写入到Servlet输出流中
                byte[] ch = new byte[1024 * 10];
                int len = 0;
                while ((len = fis.read(ch)) != -1) {
                    sos.write(ch, 0, len);
                }
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
                //文件未读取成功
                try {
                    resp.setContentType("text/html;charset=utf-8");
                    PrintWriter writer = resp.getWriter();
                    writer.write("文件名错误,请重新输入。");
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        } else {
            try {
                resp.setContentType("text/html;charset=utf-8");
                PrintWriter writer = resp.getWriter();
                writer.write("文件路径为空,请重新输入。");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

download.html

<html>
<head>
    <title>文件下载</title>
</head>
<body>
<input id="input" type="text">
<input id="button" type="button" value="下载文件">
<script>
    var inputbox = document.getElementById("input");
    var button = document.getElementById("button");

    button.onclick = function () {
        var inputValue = inputbox.value;
        window.location.href = "filedownload?filename="+inputValue;
    }
</script>
</body>
</html>

  • 当下载文件为中文时浏览器下载无法正常展示中文名的问题

  • public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
    	if (agent.contains("MSIE")){
    		filename = URLEncoder.encode(filename, "utf-8");
    		filename = filename.replace("+", "");
    	}else if (agent.contains("Firefox")){
    		Base64.Encoder encoder = Base64.getEncoder();
    		filename = "=?utf-8?B?"+encoder.encodeToString(filename.getBytes("utf-8")) + "?=";
    	}else{
    		filename = URLEncoder.encode(filename, "utf-8");
    	}
    	return filename;
    }
    

源码地址

https://github.com/xiaochen0517/StudySpace/tree/master/idea/TestDemo4

发布了50 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_25884515/article/details/103903051