下载功能其实就是用户输入指定文件路径信息,然后把文件返回给用户。(不同于上传的概念)
同时需要考虑下文件的类型,从而选择使用字符流还是字节流操作,如果传输图片,用的是字符流,可能会造成文件内容缺失,毕竟是字符为单位传输的。无论什么文件,使用字节流肯定没错。
实现步骤
- pom文件中引入了springboot-tater-web依赖
- 新建cotroller类,其中的RequestMapping方法的方法参数中配置
HttpServletResponse
类 - 方法中实现读取服务器文件流操作类,servlet写入流操作类。
完整代码
@RequestMapping("getFile")
@ResponseBody
public void getFile(HttpServletResponse response) throws Exception{
File readFile = new File("/home/ssx/Music/CloudMusic/夜曲-周杰伦.flac");
//字节流-用于读文件 这里只是demo用的非缓冲流。实际项目可以用BufferedInputStream。 此功能是读取图片,所以用的字节流。如果是文本的话可以用字符流效率高,具体类看下面注释
// BufferedReader bufferedReader = new BufferedReader(new FileReader(readFile));//字符流
FileInputStream fileInputStream = new FileInputStream(readFile);//字节流
//设置文件下载方式
response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode("夜曲-周杰伦.flac","utf-8"));
//获取servlet响应输出字节流
// PrintWriter writer = response.getWriter();//字符流
ServletOutputStream outputStream = response.getOutputStream(); //字节流
//流数据交换,每次交换10k数据大小 (1024k = 1m)
byte[] bytes = new byte[1024*10];
int read;
do {
read = fileInputStream.read(bytes);
outputStream.write(bytes,0,read);
}while (-1 != read);
//关闭资源
IOUtils.closeQuietly(fileInputStream);
IOUtils.closeQuietly(outputStream);
}