使用Spring 实现文件下载功能
页面, JSP 页面的编码设置为UTF-8
<td><a href="XXX/download?fileName=${li.url}">${li.url }</a></td>
<a href="XXX/download?fileName=Spring从入门到放弃.pdf">Spring从入门到放弃.pdf</a> <!-- 这里就是中文 -->
上面代码就是在一个JSP中,而JSP 就是一个java 类,所以上面中文编码也是UTF-8 ,而 java 类 在 网络上传输为编码格式 为 iso8859-1
XXX 代表Controller 类上的@RequestMapping 值
@RequestMapping("download")
public ResponseEntity<byte[]> download(HttpServletRequest request,String fileName) throws IOException {
String dir = new File(request.getServletContext().getRealPath("/")).getParentFile().getParent();
dir = String.format("%s%sAAA%sBBB%s", dir, File.separator, File.separator, File.separator); // dir就是一个目录(这里是我项目中的目录), win下测试你可以改成 "E:\\hello\\java"
String dfileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");
File file = new File(dir,dfileName); // 要下载的文件为 e:/hello/java/Spring从入门到放弃
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment",fileName); //返回的文件名(其实这里文件名是乱码)
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}
fileName 为前端JSP中传过来的值 它在JSP中编码为 utf-8 ,网络传输又把它编码为 iso8859-1 ,所以此处是乱码。
这时你用这个文件名访问 文件系统 肯定会报找不到文件异常, 所以需要转码。
效果图:
以上纯属瞎猜!