前言:最近做的一个项目中调用了萤石云的抓拍接口,该接口只返回了一个图片的url路径,我所需要做的是把萤石云服务器保存的图片下载下来保存到本地数据库,一开始是将图片转化为Base64格式保存到数据库,后来测试的时候发现这样效率不高,Base64是一个很庞大的字符串,仅仅存了几十张图片数据库的表都达到了20MB,另外前端页面展示的时候也有较高延迟。于是,现在要做的是将图片下载下来到本地或linux服务器,返给前端一个图片路径进行访问,提高效率,以下是博主本人在尝试该方式时遇到的一些坑,进行记录并分享给需要的猿友。

一、我先在本地做了个测试,将图片保存到项目路径下src/resources/static/images文件夹下

代码如下:

 @GetMapping("/test")public String test() throws Exception {//因为是测试,图片url可以随便搞一个,我从百度随便复制了个图片urlString pictureUrl = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fnimg.ws.126.net%2F%3Furl%3Dhttp%253A%252F%252Fdingyue.ws.126.net%252F2021%252F0812%252Fc8eb08e2j00qxqd8w0057c0012w00obg.jpg%26thumbnail%3D650x2147483647%26quality%3D80%26type%3Djpg&refer=http%3A%2F%2Fnimg.ws.126.net&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1651129353&t=f034e15dc07748726fa861080938ec36";//建立图片连接URL url = new URL(pictureUrl);HttpURLConnection connection = (HttpURLConnection)url.openConnection();//设置请求方式connection.setRequestMethod("GET");//设置超时时间connection.setConnectTimeout(10*1000);//输入流InputStream stream = connection.getInputStream();int len = 0;byte[] test = new byte[1024];//获取项目路径File directory = new File("src/main/resources/static/images");String paths = directory.getCanonicalPath();//如果没有文件夹则创建File file = new File(path);if (!file.exists()){file.mkdirs();}*///设置图片名称,这个随意,我是用的当前时间命名SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");String date = dateFormat.format(new Date());String fileName = date + ".png";//输出流,图片输出的目的文件BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(serverPath +"/" + fileName));//以流的方式上传while ((len =stream.read(test)) !=-1){fos.write(test,0,len);}//记得关闭流,不然消耗资源stream.close();fos.close();return path;}

调用接口后我们可以发现图片确实保存到了本地,但是此时我们直接访问是没有办法访问到图片的,因为target编译目录的images里并没有生成该图片,我们必须重启项目才可以访问到图片,这肯定是不行的。我们可以用下面这个方法来获取编译目录下的路径

String path = ResourceUtils.getURL("classpath:").getPath() + "static/images";

此时可以发先图片确实保存到了编译目录下,并且我们可以直接访问。但是,该方式仅限于本地测试写个小Demo来用,因为我们的项目终究是要打成jar包并运行在服务器上的,jar打包方式不支持将文件动态写入进去,这时需要通过映射的方式将文件上传到映射某一个文件夹,通过映射获取文件,并在页面显示。

二、springboot下载图片到linux服务器

1、此时我在配置文件中写入了一个linux服务器上的一个文件夹地址用来保存图片 serverPath

2、在请求拦截其中配置服务器图片映射

 @Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");//配置服务器图片映射registry.addResourceHandler("/images/**").addResourceLocations("file:"+serverPath);super.addResourceHandlers(registry);}

3、这里跟保存到本地的代码一样,只不过路径用Linux服务器上的路径

把红线部分的路径替换为服务器路径就可以了

@Value("${file.serverPath}")private String serverPath;//服务器上图片保存路径File projectFile = new File(serverPath);if (!projectFile.exists()){projectFile.mkdirs();}

4、到这里,我们可以运行项目并且测试一下看图片是否保存到Linux服务器并且能否访问到图片

OK,测试后我已经激动的一批,看样子成功了,但是呢,当我去打开linux保存图片的文件夹,却发现下边空空如也???纳尼?我的图片没存上怎么能访问

后来发现我们项目采用的是docker部署,图片保存到了dockers容器里的/workspace/images文件夹里, 不熟悉docker的小伙伴们可以自己去自学一下,docker容器里的文件我们必须做一个映射,把文件映射出来保存到宿主机里,不然docker容器重启的话里边存的文件就会丢失,下面是我在docker-compose-dev.yml文件中加入了一个配置,再次调用该接口,你就可以看到图片已经保存到linux服务器下的问/workspace/images里了

 # 映射图片文件- "/workspace/images:/workspace/images"

到这里其实可以结束了,但是呢前端要求返回的是图片全路径,这里要加上我们服务器的IP和端口号,并进行路径拼接

ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = requestAttributes.getRequest();//获取服务器IPString localAddr = request.getServerName();//获取服务器端口号int serverPort = request.getServerPort();//此处我用的是时间命名图片
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");String date = dateFormat.format(new Date());String fileName = date + ".png";//拼接路径,数据库中可以直接保存该路径,返回前端,前端即可访问String path = "http://"+localAddr +":"+ serverPort +"/api"+serverPath+ fileName;

over!感谢观看

springboot下载网络图片到本地及Linux服务器(超详细)相关推荐

  1. Android下载网络图片到本地

    Android下载网络图片到本地sdcard中 1.方法调用: imageDownload(https://www.baidu.com/img/bdlogo.png); 2.图片下载: private ...

  2. 【PyTorch】构造VGG19网络进行本地图片分类(超详细过程)——项目介绍

    本篇博客主要解决以下3个问题: 如何自定义网络(以VGG19为例). 如何自建数据集并加载至模型中. 如何使用自定义数据训练自定义模型. 第一篇:[PyTorch]构造VGG19网络进行本地图片分类( ...

  3. stm32移植paho_如何在STM32上移植Linux?超详细的实操经验分享

    原标题:如何在STM32上移植Linux?超详细的实操经验分享 刚从硬件跳槽为嵌软时,没有任何一丝的准备.一入职,领导就交代了一项特难的任务--在stm32上移植linux! 瞬间我就懵了,没办法硬着 ...

  4. 微信授权登录后,把获取的信息存储到本地数据库中(超详细有用)!

    微信授权登录后,把获取的信息存储到本地数据库中(超详细有用)!下面一起来看看吧! <?php namespace Home\Controller; use Think\Controller; c ...

  5. 如何将SpringBoot项目部署到阿里云Linux服务器中

    在此之前,我写了一个如何购买阿里云Windows服务器,并将自己的SpringBoot项目部署到Windows云服务器的博客,链接如下:https://blog.csdn.net/MagicMHD/a ...

  6. xshell下载mysql到本地文件_在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹)-Go语言中文社区...

    在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹) 1 列出所有需要copy的sh文件 -bash-4.1$ ll /mysqllog/osw/*.sh ...

  7. 记录一些关于操作数据库(本地和linux服务器)常用的命令

    在linux服务器上进行备份 -h 后面为数据库的地址 -u名字 -p 密码 存于根路径 linux备份 mysqldump -hrm-bp196m0sn25b4pnf5o.mysql.rds.ali ...

  8. THREE DAY | 网络安全之Linux(包含Linux常用命令,镜像下载,docker命令等内容)超详细!!!

    THREE DAY | 网络安全之Linux 一.Linux介绍 1.Linux系统简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多 ...

  9. 使用EwoMail搭建属于自己的个人邮件服务器——超详细图文教程

    为什么要搭建个人的邮件服务器呢? 本人是java开发工程师,玩过javaMail的都知道,当我们使用javaMail发送邮件的时候,我们一般使用的是个人邮箱账号,如:126或qq邮箱,那如果我们想让自 ...

最新文章

  1. 网络获取json数据并解析
  2. Vijos P1696 数与连分数【连分数】
  3. java 封箱_java封箱和拆箱分析
  4. 深信服C/C++技术一面二面20180924
  5. 一文纵览EMAS 到底内含多少阿里核心技术能力
  6. linux中s权限大小写的区别,Linux中的权限
  7. 程序员惊魂 12 小时:“���”引发线上事故
  8. ExtJS EditorGridPanel 示例之JSON格式Store前后台增删改查
  9. ArcGIS Python工具箱集成第三方模块的解决办法
  10. 诞生11年,入华9年,今年的智慧城市会更好吗?
  11. Acer 4250G TL 58 Vista 系统装xp系统完全攻略
  12. 网易面试总结——面试案例1~面试案例4
  13. go语言视频教程_ go语言入门视频教程_go语言实战视频教程
  14. glib实现Socket通信
  15. 聚合供应链,Saas系统
  16. 1.2开发小程序的准备工作
  17. Jquery-canvas动态粒子背景动画-适用于登陆注册页面背景
  18. 多线程使用场景及总结
  19. 亚稳态原因以及跨时钟处理方法
  20. codeforces-26A-Almost Prime【分解质因数】

热门文章

  1. c语言程序设计评分标准,c语言程序设计期末(A)标准答案及评分标准.doc
  2. 江苏省普通话水平测试计算机评分细则,江苏省计算机辅助普通话水平测试评分细则...
  3. 正则表达式中[A-z]和[a-zA-Z]的区别
  4. 降噪蓝牙耳机排行榜10强,通话质量好的降噪蓝牙耳机推荐
  5. Manjaro更换系统默认字体,主题
  6. BigDecimal四舍五入保留两位小数
  7. flutter中App签名
  8. 使用QQ邮箱“邮我”组件,给我写信/意见反馈!方便他人快速给你发邮件
  9. 微信客户管理方式及如何微信客户管理
  10. 前端做大屏显示,缩放比,分辨率怎样适配?