比如说,下载的文件名为: 软件分析报告.docx,当使用流抛给浏览器下载时,浏览器下载的文件为:-----------.docx
出现这种情况的原因:大体的原因就是header中只支持ASCII,所以我们传输的文件名必须是ASCII,所以说当文件名为中文时,必须要将该中文转换成ASCII。
// 文件名可以任意指定 response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));
其中 URLEncoder.encode(filename,"UTF-8") 就是将文件名转为ASCLL
java实现浏览器下载:
public void downloadFile(String id, HttpServletResponse response) { if(!StringUtils.isEmpty(id)) { GridFSDBFile gridFSDBFile = dynamicService.getGridFSDBFile(Integer.parseInt(id));//从mongodb上获取文件信息 int buffer = 1024 * 10; byte data[] = new byte[buffer]; InputStream inputStream = gridFSDBFile.getInputStream();//获取输入流 BufferedInputStream bis = new BufferedInputStream(inputStream, buffer); try { String filename = gridFSDBFile.getFilename(); response.setContentType(FileUtils.getContentType(filename)); // 文件名可以任意指定 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));//将文件名转为ASCLL编码 int read; while ((read = bis.read(data)) != -1) { response.getOutputStream().write(data, 0, read); } inputStream.close(); bis.close(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }