@RequestMapping("/download") public void download(HttpServletRequest request, HttpServletResponse response) throws IOException { UploadVO uv = null; // TODO response.setContentType(uv.getFileType()); response.setHeader("Content-disposition", "attachment;filename=" + uv.getFileName()); ServletOutputStream out = response.getOutputStream(); IOUtils.copy(new FileInputStream(uv.getFilePath()), out); out.flush(); out.close(); }檔名是 ISO8859-1 認識的字元沒問題,一旦遇到其他字元集,例如中文,還是可以下載,只是中文字都會變成空白或亂碼。
Google 到的解答有點討厭,作法因瀏覽器而異,IE、Firefox 與 Chrome 都不一樣,其他瀏覽器就不知道了。
private String encodeFileName(HttpServletRequest request, String fileName) throws UnsupportedEncodingException { String userAgent = request.getHeader("user-agent"); String encodedFileName; // IE if (StringUtils.contains(userAgent, "MSIE")) { encodedFileName = URLEncoder.encode(fileName, "utf-8"); } // Firefox else if (StringUtils.contains(userAgent, "Firefox")) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < fileName.length(); i++) { char c = fileName.charAt(i); // Firefox 會自空白處切斷,所以將空白轉為+ if (((int) c) < 128) { sb.append(URLEncoder.encode(String.valueOf(c), "ISO8859-1")); } else { sb.append(new String(String.valueOf(c).getBytes(), "ISO8859-1")); } } encodedFileName = sb.toString(); } // Chrome else { encodedFileName = MimeUtility.encodeWord(fileName, "utf-8", "Q"); } return encodedFileName; }挺頭痛的解法。
---
---
---
受用了謝謝
回覆刪除不客氣
刪除