springboot实现web浏览器图片下载功能(图片以二进制的形式存储在数据库中)

1、实现思路:

①前端url传给服务器图片id,根据id查找对应图片的二进制数据

②图片实体类用byte[]接收图片二进制数据

③repsonse设置浏览器响应设置

④response.getWriter() 用于处理字符流数据

⑤response.getOutputStream()用于输出字符流数据或者二进制的字节流数据

因为是字节,这里用⑤不用④

    /**
     * 功能描述:
     * @param: id  对应数据库中哪个照片的id(前端id参数)
     * @param: response 返回给前端数据( 图片下载)
     * @return: void
     * @author: Administrator
     * @since: 2019/9/27 0027
     */
    @GetMapping("/downloadFile")
    public void downloadFile(Integer id , HttpServletResponse response ) throws IOException {

        //查找对应图片二进制文件
        Photo photo = photoService.findPhotoById(id);

        //保存后图片的命名
        Date date = new Date(); //获取当前的系统时间。
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss") ; //使用了默认的格式创建了一个日期格式化对象。
        String time = dateFormat.format(date); //可以把日期转换转指定格式的字符串
        //拼接,得到保存后的文件名
        String fileName = photo.getName() + ".png";

        //获取到二进制图片数据
        byte[] data = photo.getPhoto();
        //设置文件名编码
        fileName = URLEncoder.encode(fileName, "UTF-8");
        //清除缓冲区中存在的任何数据以及状态代码和标头。如果已提交响应,此方法将抛出一个IllegalStateException。
        response.reset();
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
        response.addHeader("Content-Length", "" + data.length);
        response.setContentType("application/octet-stream;charset=UTF-8");

        //用于处理字符流数据 response.getWriter()
        //用于输出字符流数据或者二进制的字节流数据   response.getOutputStream()
        OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
        outputStream.write(data);
        outputStream.flush();
        outputStream.close();
        response.flushBuffer();


    }

 

你可能感兴趣的:(SpringBoot,文件与IO)