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

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

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

代码如下:

 @GetMapping("/test")
    public String test() throws Exception {
        //因为是测试,图片url可以随便搞一个,我从百度随便复制了个图片url
        String 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、在请求拦截其中配置服务器图片映射

 @Override
    public 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();
        //获取服务器IP
        String 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!感谢观看

### 回答1: 1. 首先,需要在Linux服务器上安装Java环境,可以通过以下命令安装: ``` sudo apt-get update sudo apt-get install openjdk-8-jdk ``` 2. 然后,将Spring Boot应用程序打包成可执行的JAR文件,可以使用Maven或Gradle构建工具来完成此操作。 3. 将JAR文件上传到Linux服务器,可以使用scp命令将文件从本地计算机复制到远程服务器: ``` scp /path/to/your/app.jar user@server:/path/to/remote/directory ``` 4. 在Linux服务器上运行Spring Boot应用程序,可以使用以下命令: ``` java -jar /path/to/your/app.jar ``` 如果需要在后台运行应用程序,可以使用nohup命令: ``` nohup java -jar /path/to/your/app.jar & ``` 5. 最后,可以使用浏览器访问应用程序的URL,例如http://localhost:808,以确保应用程序已成功部署到Linux服务器上。 ### 回答2: SpringBoot是一个快速开发应用程序的框架,它提供了自动配置功能和开箱即用的注解,使得开发者能够更快速地完成应用程序的开发和部署。那么如何将SpringBoot应用程序部署到Linux服务器上呢?本文将为大家提供一些关键步骤。 1.安装Java SpringBoot应用程序是基于Java的,因此首先需要在服务器上安装Java环境。我们可以使用命令"sudo apt-get install openjdk-8-jdk"来安装OpenJDK 8。 2.上传SpringBoot应用程序 将SpringBoot应用程序打包成jar包,并将其上传到服务器。可以使用FTP或SCP等工具上传。 3.创建启动脚本 创建一个启动脚本来启动SpringBoot应用程序。启动脚本通常包括Java命令、启动参数、日志配置等。例如: ``` #!/bin/bash #定义应用程序目录和jar包名称 APP_HOME=/home/myapp APP_NAME=myapp.jar # java命令 JVM_OPTS="-Xms256m -Xmx256m" # 启动命令 nohup java $JVM_OPTS -jar $APP_HOME/$APP_NAME --spring.profiles.active=prod > $APP_HOME/myapp.log 2>&1 & ``` 4.部署启动脚本 将启动脚本部署到服务器的合适位置,并赋予脚本执行权限。例如: ``` sudo chmod +x /home/myapp/myapp.sh ``` 5.启动应用程序 执行启动脚本来启动SpringBoot应用程序。例如: ``` sudo /home/myapp/myapp.sh start ``` 6.检查应用程序状态 使用命令"ps -ef | grep myapp"可以查看SpringBoot应用程序的进程状态。如果应用程序正在运行,则应该看到与应用程序相关的进程。 至此,我们已经成功将SpringBoot应用程序部署到Linux服务器上。但是,在实际生产环境中,还需要考虑一些其他因素,例如应用程序的高可用性、负载均衡等。因此,在进行实际的生产环境部署前,需要对具体情况进行详细的规划和测试。 ### 回答3: Spring Boot 是一款开源的 Java 开发框架,可以快速构建高效稳定的 Web 应用程序,适用于大型企业级应用的开发。部署 Spring Boot 应用程序到 Linux 服务器时,需要掌握以下几个关键点。 首先,需要在 Linux 服务器上安装 JDK,Spring Boot 应用程序需要运行在 JDK 环境下。可以通过运行 java -version 命令来确保 JDK 是否已经安装成功。 然后,需要将 Spring Boot 应用程序的 jar 包上传到 Linux 服务器上,并在服务器上创建一个目录来存储应用程序的配置文件。可以使用 scp 命令将 jar 包上传到服务器,例如: scp target/XXX.jar user@xxx.xxx.xxx.xxx:/home/user/app/ 接着,可以使用命令 nohup java -jar XXX.jar --spring.config.location=/home/user/app/application.yml & 来运行 Spring Boot 应用程序。其中,--spring.config.location 参数指定了应用程序的配置文件路径。 此外,为了确保 Spring Boot 应用程序在后台持续运行,可以将其包装成一个 Linux 服务,并配置自启动。例如,在 /etc/systemd/system/ 目录下创建一个名为 myapp.service 的服务文件,内容如下: [Unit] Description=Spring Boot Application [Service] User=user Group=user ExecStart=/usr/bin/java -jar /home/user/app/XXX.jar --spring.config.location=/home/user/app/application.yml SuccessExitStatus=143 [Install] WantedBy=multi-user.target 在服务文件中,我们指定了应用程序的 jar 包路径和配置文件路径,以及启动参数。然后,使用 systemctl 命令启动服务,并设置为开机自启动。 最后,需要配置防火墙,将对应的端口开放,以确保 Spring Boot 应用程序可以被外部访问。可以使用 firewall-cmd 命令进行配置,例如: firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload 这样,就可以在 Linux 服务器上成功部署 Spring Boot 应用程序了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值