您好,登錄后才能下訂單哦!
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**方式進行配置。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。