HTML的a标签无法下载文件的解决方案

2023-04-24,

   web端最简单的下载文件方式是采用html中a标签形式直接进行下载,只需要将文件的全路径赋值给href,同时给download属性赋予文件名即可。但是有些浏览器(chrome、firefox、IE edge等)可以下载,有些浏览器(IE8-11等)则在网页上直接打开,有时候还会是乱码。所以为了彻底解决这个,需要在服务器端想办法进行解决。
   在spring框架下,通过href链接下载时,设置Servlet拦截相应的url,然后进入后台进行相应的输入。
         示例代码如下:
         public void fileOutputStream(HttpServletRequest req, HttpServletResponse resp) 
                throws ServletException, IOException {
            String filepath = req.getRequestURI();
            int index = filepath.indexOf(Global.USERFILES_BASE_URL);
            if(index >= 0) {
                filepath = filepath.substring(index + Global.USERFILES_BASE_URL.length());
            }
            try {
                filepath = UriUtils.decode(filepath, "UTF-8");
            } catch (UnsupportedEncodingException e1) {
                logger.error(String.format("解释文件路径失败,URL地址为%s", filepath), e1);
            }
            File file = new File(Global.getUserfilesBaseDir() + Global.USERFILES_BASE_URL + filepath);
            try {
                resp.setContentType("application/x-msdownload; charset=utf-8");  
                resp.setHeader("Content-Disposition", "attachment;");
                FileCopyUtils.copy(new FileInputStream(file), resp.getOutputStream());
                return;
            } catch (FileNotFoundException e) {
                req.setAttribute("exception", new FileNotFoundException("请求的文件不存在"));
                req.getRequestDispatcher("/WEB-INF/views/error/404.jsp").forward(req, resp);
            }
        }

        关键代码:resp.setHeader("Content-Disposition", "attachment;");这里指定输出是附件。这样的话,就明确的告诉浏览器这是在下载附件,从而解决了不同浏览器可能会出现直接打开文件甚至乱码问题。
        对于tomcat而言,查看conf/web.xml,寻找所有的mime类型,如果存在你需要下载的文件的话,即不用进行修改,如果不存在的话,需要添加,然后重启服务器,给a标签赋值要下载文件的全路径即可(比如xls的文件就不用修改配置,而rar就需要配置,zip也不需要配置);注意,如果路径中包含中文的话,还需要稍微改动,否则可能会无法下载,需要在Server.xml文件中,在http端口设置处,需要加上编码,如下:
        <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
        注意URIEncoding赋值为UTF-8,。因为对于get方式请求过来的编码,若文件路径中存在中文,则可能出现乱码。对于post请求过来的编码,可以用传统的request.setContent**方式进行配置。

《HTML的a标签无法下载文件的解决方案.doc》

下载本文的Word格式文档,以方便收藏与打印。