springboot下载文件功能

下载功能其实就是用户输入指定文件路径信息,然后把文件返回给用户。(不同于上传的概念) 同时需要考虑下文件的类型,从而选择使用字符流还是字节流操作,如果传输图片,用的是字符流,可能会造成文件内容缺失,毕竟是字符为单位传输的。无论什么文件,使用字节流肯定没错。

实现步骤

  1. pom文件中引入了springboot-tater-web依赖
  2. 新建cotroller类,其中的RequestMapping方法的方法参数中配置HttpServletResponse类
  3. 方法中实现读取服务器文件流操作类,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);
}
经验分享 程序员 微信小程序 职场和发展