完美解决java截图网页并保存到数据库中预览

完美解决java截图网页并保存到数据库中预览

公司项目中老板提的需求,说是作为一个亮点,这里下载两个驱动,window和liunx的,在执行的时候通过判断当前系统是什么类型的然后进行调用不同的驱动

正在负责做公司的监控系统模块,主要架构就是分为前台,后台。
后台只是一个springboot程序,会打成jar包放到服务器,让其自启检测,里面是一个个定时任务,会将检测服务器的cpu,端口,数据库等等,然后将检查结果放到数据库里,前台只是负责配置检测项等。

其中有一个检查项就是检查网页是否能正常打开,如果能打开,我们在前台能够预览一下,但是他们不属于一个程序,最初的解决方案就是将请求的结果的源码放到数据库,然后通过html渲染出来,因为有很多静态资源不能显示,所以方案否认。

最终通过phantojs,无头浏览器,执行js脚本进行网页截图,但是图片预览怎么访问呢,后台程序也不是web程序,图片存放的访问路径也不好访问,又不想使用其他存储服务,于是,决定在后台程序中再读取一下图片并转为base64格式存放到数据库,然后前台程序拿到base64之后就可以直接进行解析成图片了。

代码如下

springboot的resources结构,其中pluging就是需要用到的驱动和执行脚本,必须要有
在这里插入图片描述



//工具类
package com.open.capacity.yachtar.utils.cutting;

import org.springframework.core.io.ClassPathResource;
import sun.misc.BASE64Encoder;

import java.io.*;

/**
 * @create 2023-03-02 10:08:32
 *//*
@author ljj
@date 2023-03-02 10:08
*/
public class Utils {
    final static String BLANK = "  ";

    //通过phantomjs将url截取成图片保存
    public static String UrlHtmlToImage(String phantomPath, String jsPath, String url, String dest) throws IOException {
        Process process = Runtime.getRuntime().exec(phantomPath + BLANK //你的phantomjs.exe路径
                + jsPath + BLANK //就是上文中那段javascript脚本的存放路径
                + url + BLANK //你的目标url地址
                + dest);//你的图片输出路径

        InputStream inputStream = process.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
        return dest;
    }

   //将打包后的文件的绝对地址取出来,打成jar包的里面的文件是获取不到绝对路径的
//    status=0window,=1liunx
    public static String getTargetPathToAbsPath(String targetPath, int status) throws IOException {
        //获取文件输入流
        InputStream resourceAsStream = Utils.class.getClassLoader().getResourceAsStream("pluging/" + targetPath);
        if (status == 0) {//所以我们需要把对应的文件根据操作系统先复制到本地下面,然后使用
            //window上的位置
            File localFile = new File("c:\\TEMP\\" + targetPath);
            if (!localFile.exists()) {
                //如果本地没有该文件,则复制一个
                FileOutputStream fileOutputStream = new FileOutputStream(localFile);
                IOUtils.copy(resourceAsStream, fileOutputStream);
                fileOutputStream.close();//必须关闭,否则会报错程序被占用

            }
            return localFile.getAbsolutePath();//返回本地文件路径
        } else {
            //liunx
            File localFile = new File("/tmp/" + targetPath);
            if (!localFile.exists()) {
                FileOutputStream fileOutputStream = new FileOutputStream(localFile);
                IOUtils.copy(resourceAsStream, fileOutputStream);//复制到liunx的对应路径
                fileOutputStream.close();
            }
            return localFile.getAbsolutePath();

        }

    }

    public static String imageToBase64(String path) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        byte[] data = null;
        // 读取图片字节数组
        try {
            InputStream in = new FileInputStream(path);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);// 返回Base64编码过的字节数组字符串
    }

}



 /*

    截图程序,根据url地址,返回一个base64的图片,
     */
    public String cuttingUrlToImage(String url) throws IOException {
        String phantomJsPath = "";
        String jsPath = "";//截图js脚本

        //截屏并保存在相应路径,返回一个图片的路径
        String fpath = "";
        //根据操作系统
        if (CommonUtils.isWindowsOS()) {
            //如果是window,则选择合适的phantomjs
            phantomJsPath = Utils.getTargetPathToAbsPath("phantomjs.exe", 0);
            jsPath = Utils.getTargetPathToAbsPath("jt.js", 0);
            //获取js的路径
            fpath = "C:\\TEMP\\temp.jpg";

        } else {
            phantomJsPath = Utils.getTargetPathToAbsPath("phantomjs", 1);
            //获取js的路径
            jsPath = Utils.getTargetPathToAbsPath("jt.js", 1);
            fpath = "/tmp/temp.jpg";

        }


        if (StringUtils.isEmpty(phantomJsPath)) {
            return "操作系统不支持";
        }


        String s = Utils.UrlHtmlToImage(phantomJsPath , jsPath, url, fpath);
        String base64Image = "data:image/jpg;base64," + Utils.imageToBase64(s);//根据图片路径将对应的图片转为base64
        File file = new File(fpath);//生成一个临时的图片,并转为base64,然后把图片删除
        if (file.exists()) {
            file.delete();
        }
        return base64Image;

    }

//js脚本
var page = require('webpage').create();
system = require('system');
//var url = 'http://yule.club.sohu.com/gifttrade/thread/2m2efbrpfui';  
var address;
var filePath;
if (system.args.length == 1) {
    phantom.exit();
} else {
    adress = system.args[1];   
    page.open(adress, function (status) {
        if (status != "success") {
            console.log('FAIL to load the address');
            phantom.exit();
        }
        page.viewportSize = {//截图大小
            width: 1300,
            height: 800
        };
        /*
        page.evaluate(function () {
            //此函数在目标页面执行的,上下文环境非本phantomjs,所以不能用到这个js中其他变量
            window.scrollTo(0, 10000);//滚动到底部
            //window.document.body.scrollTop = document.body.scrollHeight;
            /*
          window.setTimeout(function(){
              var plist = document.querySelectorAll("a");
              var len = plist.length;
              while(len)
              {
                  len--;
                  var el = plist[len];
                  el.style.border = "1px solid red";
              }
          },5000);
        });*/
        // page.clipRect = {
        //     top: 0,
        //     left: 0,
        //     width: 1500, //宽度
        //     height: 800, // 高度
        // }
        filePath = system.args[2];
        window.setTimeout(function () {
            //在本地生成截图  
            page.render(filePath);
            // console.log(page.content);
            console.log('render success...')
            phantom.exit();
        }, 2000 + 1000);
    });
}  

测试结果如下

String photo="D:\\分类\\demo\\src\\main\\resources\\phantomjs.exe"; //驱动所在路径
        String jsPath="D:\\分类\\demo\\src\\main\\resources\\jt.js";  //js脚本所在路径
        String url="https://www.baidu.com"; //访问的url
        String dest="D:\\分类\\demo\\src\\main\\resources\\a.png";    //保存图片的位置
        String s = UrlHtmlToImage(photo, jsPath, url,dest); //获取截图的保存的位置
        System.out.println(s);

截取的图片

调用转换成base64方法

String base64 = imageToBase64(image);
System.out.println(base64);

在这里插入图片描述

说明

将base64字符串保存到数据库中对应字段即可,然后前端进行渲染。若有oss存储,则截图图片直接上传到oss服务,然后使用oss路径存储到对应字段中更好。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java编写简单学生成绩管理系统,并将学生成绩保存数据库,可以按照以下步骤进行操作: 1. 首先,要建立一个数据库保存学生成绩信息。可以选择常用的关系型数据库(如MySQL、Microsoft SQL Server等)或者NoSQL数据库(如MongoDB)。 2. 在Java,使用JDBC(Java Database Connectivity)连接数据库。JDBC提供了一组API,可以与不同类型的数据库进行交互。 3. 首先,需要在Java代码导入JDBC库,然后创建一个连接对象来连接数据库。连接对象需要指定数据库的URL、用户名和密码等信息。 4. 创建学生成绩管理系统的实体类,包括学生姓名、学号、课程、成绩等属性。可以使用Java的面向对象的编程方法来定义这些类,并添加相应的属性和方法。 5. 在Java代码,使用SQL语句来创建数据库表。可以使用CREATE TABLE语句来创建一张包含学生成绩信息的表。表的字段应该包括学生姓名、学号、课程、成绩等字段。 6. 编写Java代码来实现学生成绩管理系统的各个功能,例如添加学生信息、查询学生成绩、修改学生成绩等。可以使用Java的面向对象的编程方法,将每个功能封装在相应的方法。 7. 在Java代码,使用JDBC的API来执行SQL语句,将学生成绩信息插入到数据库,或者从数据库查询学生成绩信息。 8. 使用Java的异常处理机制来处理可能出现的异常。例如,如果数据库连接失败,可以捕获并处理异常,并进行相应的提示或操作。 9. 测试该学生成绩管理系统,可以添加一些学生成绩信息到数据库,并通过查询功能来验证数据是否正确保存数据库。 通过以上步骤,我们可以使用Java编写一个简单的学生成绩管理系统,并将学生成绩保存数据库。不同的数据库和数据表结构可能会有所区别,具体的实现方式需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值