提示:这里需要用到Servlet/ServletRequest相关知识,不熟悉的要去复习哟
前言
提示:利用流下载文件,保存方式有好几种,把图片保存在本地,或者用户选择文件目录保存,还可以保存response对象中。
提示:以下是本篇文章正文内容,下面案例可供参考
一、怎么获取request,response对象?
业务场景:在做一些登录案例的时候,可以通过resquest.getparameter("userName")来获取前端发送数据,从而进行用户名密码校验,在做身份认证,也可以通过请求头来获取token,实现token认证。
第一种方式:直接在controller定义这个两个参数
@PostMapping("/download")
@ResponseBody
@ApiImplicitParam(name = "id" ,value = "主键id",required = true ,dataType = "string")
public JsonResult downLoad(@RequestParam("id") String id,HttpServletRequest request,HttpServletResponse response){
panoramaService.downLoadPanorama(id);
return JsonResult.ok();
}
缺点:
这种方式最简单,直接,但项目中总会遇到参数特别多的接口,再者做远程调用,给人感觉参数太多,破坏了接口的单纯性(个人意见)。
第二种方式:自动注入,哪里需要,加哪里。
@Resource
private HttpServletRequest httpServletRequest;
@Resource
private HttpServletResponse httpServletResponse;
第三种方式:通过RequestContextHolder类的方法获取requestAttributes,再从中获取请求和响应对象。
//分别获得request,response对象
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
HttpServletResponse response = attributes.getResponse();
总结:根据业务选择合适的方式
二、使用response保存图片
1.完整代码
代码如下(示例):
// 获得request对象,response对象
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
HttpServletResponse response = attributes.getResponse();
//根据前端传的id去数据库找对应图片信息
Panorama panorama = panoramaDao.selectById(id);
//获取图片地址
String bImageNew = panorama.getBImageNew();
//截取掉..
String prefix = bImageNew.substring(2);
//截取最后一个\\之前的路径
String suffix = org.apache.commons.lang3.StringUtils.substringBeforeLast(prefix, "\\");
//设置后缀
String setSuffix = "\\pano.JPG";
//由于string拼接效率较低
StringBuilder uploadPath= new StringBuilder();
//数据库的路径不对,重组路径
uploadPath.append("target\\classes\\static\\panorama").append(suffix).append(setSuffix);
//文件真实路径
String realPath = String.valueOf(uploadPath);
//获取文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//文件名进行utf8编码
try {
fileName = URLEncoder.encode(fileName,"utf-8");
} catch (UnsupportedEncodingException e) {
throw new BusinessException("编码失败");
}
FileInputStream inputStream = null;
try{
inputStream = new FileInputStream(realPath);
}catch (Exception e){
throw new BusinessException("图片不存在");
}
try {
//设置请求头,使得浏览器可以支持我们下载文件(固定写法)
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
ServletOutputStream out = response.getOutputStream();
//建立缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//完成读写文件
while ((len = inputStream.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
//关闭资源
out.close();
inputStream.close();
}catch (Exception e){
throw new BusinessException("图片太大");
}
2.用swagger测试
由于是保存在response对象中,会返回一个downloan file 点击,可以下载了
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
这段代码如果放到,FileInputStream前面,异常会被吃掉。