1. 程式人生 > >HTML的a標簽無法下載文件的解決方案

HTML的a標簽無法下載文件的解決方案

a標簽下載文件;下載文件直接打開

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標簽無法下載文件的解決方案