👨🎓作者:bug菌 💌公众号:猿圈奇妙屋 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理
接下来的这几期,bug菌想跟大家分享一下自己昨天刚接到一个临时的需求,热乎着呢,想分享一下自己是如何面对临时需求并制定整个开发周期,其中包括从梳理业务到创建业务表再到实现业务逻辑形成闭环再到与前端对接,其中会穿插一些业务拓展及功能性拓展,这一条龙流程在线与大家一起见证,分享给刚入门的小伙伴,希望对你们有所帮助。
环境说明:idea2019.3 + springboot2.3.1.REALSE + mybati-plus3.2.0 + mysql5.6 + jdk1.8
在上一期,我们是完整的讲述了从Controller接口定义到接口方法实现,完美实现了按指定路径进行图片上传及数据库记录插入。而这一期,我要给大家讲点什么嘞?你们想知道么?其实也有据可循,你们想想,一个业务肯定是要形成闭环,图片也是,图片上传就要支持本地下载、在线预览、在线删除等业务线。所以这一期,我给大家讲讲,如何实现指定图片在线预览功能,具有很好的教学价值,希望大家能挺我,认真把它看完。
既然说到图片预览,那肯定也是得从接口定义开始,我们先来思考一下,接口入参有些啥,那就看具体业务了,我是按人分图片保存,自然就会涉及到用户账号id,通过用户账号id进行把用户分成n个文件夹,然后再是具体的问题反馈图片,所以,入参1是查看图片所对应的用户账户id,其次入参2就是要查看那张图片的完整名称,比如test.png.这样我就能根据首路径+账户id+图片名合拼出访问该图片的绝对路径了。
废话不多说,我们接着看,既然确定了入参,那就大胆的把该接口定义出来吧啊。
/**
* 图片预览
*/
@GetMapping("/review-img-by-path")
@ApiOperation(value = "图片预览", notes = "根据图片地址进行预览")
public void reviewImgByPath(@ApiParam("图片路径") @RequestParam("imgPath") String imgPath,
@ApiParam("反馈人的域账号id") @RequestParam("accountId")
这里主要就是定义reviewImgByPath接口。具体如何定义请看如下:
void reviewImgByPath(String imgPath, String accountId);
这里可谓是核心业务逻辑了。毕竟你是要实现该方法的,我就来说说我的大致思路,主要的就是要拼接处该图片的绝对地址,也就是当初你保存的图片路径加固定的父路径加用户id。
具体如何实现请看如下:
@Override
public void reviewImgByPath(String imgPath, String accountId) {
//获取response
HttpServletResponse response = SpringServletContextUtils.getResponse();
//拼接预览图片全路径
String targetPath = this.buildImgPath(imgPath, accountId);
File file = new File(targetPath);
//调用预览方法
对于buildImgPath方法,这跟图片上传共用一个方法,所以这里我们也是直接调用,没啥区分,都是合路径。
private String buildImgPath(String imgPath, String accountId) {
return
既然 我们成功把图片的全路径拼接完成,最终就是呀如何通过代码的方式进行图片预览了,最笨的方式就是通过存储静态 资源 的方式,然后我们只需要访问静态路径就能预览图片,但是我们既然拿出来演示,自然就不会用这种这么low的方式了哈。
至于如何实现,我们 接着往下看。
如下,我对于改图片预览实现,有研究出两种实现方式供大家参考,这个具体看大家兴趣,喜好那种就按那种实现方式来定,bug菌亲测都是有效的哈,没有不收费。
预览方式1:
/**
* 图片预览方式1
*/
public void reviewImg1(HttpServletResponse response, String targetPath) throws IOException {
FileInputStream fis = new FileInputStream(targetPath);
OutputStream os = response.getOutputStream();
try {
int count = 0;
byte[] buffer = new byte[1024 * 1024];
while ((count = fis.read(buffer)) != -1) {
os.write(buffer, 0, count);
os.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (os != null) {
os.close();
}
if (fis != null) {
fis.close();
}
}
}
预览方式2:
/**
* 图片预览方式2
*/
public void reviewImg2(HttpServletResponse response,File file) {
//文件目录
if (file.exists()) {
byte[] data = null;
try {
FileInputStream input = new FileInputStream(file);
data = new byte[input.available()];
input.read(data);
response.getOutputStream().write(data);
input.close();
} catch (Exception e) {
System.out.println(e);
}
} else {
return;
}
}
如上是我提供的两种预览图片的实现方式,如果对于你们而言,那种更易于理解,你们就倾向使用那种吧,虽然 都能实现图片预览,但是原理还是有些不同的,你们仔细品位品位,你们就会知道,它有何不同。
这里我提供两种预览方式,一是通过postman测试接口进行图片预览,postman也是支持在线预览功能。
方式2就是直接在你的浏览器上进行接口访问,也是可以的。