使用laravel框架与phantomjs实现截屏功能

在网上看到的关于phantomjs实现截屏功能很多都是与node结合在一起使用,并需要输入命令才能执行。因此我想要实现输入网址即可截屏并输出图片的功能。

一:下载并安装phantomjs

二:装后台集成环境Appserv

三:安装laravel开发框架

三:实现代码及注意事项

1、phantomjs很好安装,http://phantomjs.org/官网下载到任意目录(注意:如果为了省事,最好安装到本地环境变量的目录下  如下图),如果不想下载到此目录下,可下载完后到计算机属性的环境变量增加phantomjs放置的路径

2、appserv集成环境,可到我的百度网盘下载appserv程序   链接:http://pan.baidu.com/s/1bpNHJcV 密码:kdx4  ,手动安装。当然这个集成环境只是为了方便部署,里面集成了appache,简单方便。如果想使用iis发布也可以省略这个步骤。

3、laravel框架下载,链接:http://pan.baidu.com/s/1dFB26Sp 密码:ki0f      下载解压后放到刚刚安装好的appserv文件夹下的www文件夹下。

此时可以看看有没有安装成功。到浏览器下输入http://localhost/laravel/public/这个路径,因为这个appserv默认是80端口,如果在安装时没有修改,那么就需要确认iis没有占用80端口。如果浏览器有界面出来,那么说明安装成功了。如果没有出现界面,那么到控制面板-》管理工具-》服务  下看看apache24和mysql57有没有启动,没有就手动启动。

此时需要的程序都安装完了,下面开始写代码。

首先到phantomjs文件夹的bin目录下创建一个js文件

snap.js代码

var page = require(‘webpage‘).create();
var args = require(‘system‘).args; 

var url = args[1];
var filename = args[2]; 

page.viewportSize={width:1024,height:768};

page.open(url, function () {
    page.render(filename);
    phantom.exit();
});

接下来到laravel文件夹下的resources的views文件夹下修改html代码,我只是把laravel重命名了,如果重命名,那么到浏览器输入地址也应该随着一起改变

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <!--<meta name="viewport" content="width=device-width, initial-scale=1.0" />-->
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    <title>快照生成</title>
    <script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        form {
            padding: 20px;
        }

        div {
            margin: 20px 0 0;
        }

        input {
            width: 200px;
            padding: 4px 2px;
        }

        #placeholder {
            display: none;
        }
    </style>
</head>

<body>
<form action="" id="form">
    <input type="text" id="url" />
    <button type="submit">生成快照</button>
    <div>
        <img src=""  id="placeholder" />
    </div>
</form>
<script>
    $(function(){
        $(‘#form‘).submit(function(){
            if (typeof($(this).data(‘generate‘)) !== ‘undefined‘ && $(this).data(‘generate‘) === true)
            {
                alert(‘正在生成网站快照,请耐心等待...‘);
                return false;
            }

            $(this).data(‘generate‘, true);
            $(‘button‘).text(‘正在生成快照...‘).attr(‘disabled‘, true);

            $.ajax({
                type: ‘GET‘,
                url: ‘http://localhost/laravel&phantomjs/public/test1‘,
                data: ‘url=‘ + $(‘#url‘).val(),
                success: function(data){
                    $(‘#placeholder‘).attr(‘src‘, data).show();
                    $(‘#form‘).data(‘generate‘, false);
                    $(‘button‘).text(‘生成快照‘).attr(‘disabled‘, false);
                }
            });

            return false;
        });
    });
</script>
</body>
</html>

在这个controllers目录下新建一个php文件,命名一定是controller.php结尾

blogcontroller.php文件代码

<?php

namespace App\Http\Controllers;

use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;

class BlogController extends Controller {
    public function test1()
    {
        if (isset($_GET[‘url‘]))
        {
            set_time_limit(0);

            $url = trim($_GET[‘url‘]);
            $filePath = md5($url).‘.png‘;
            if (is_file($filePath))
            {
                exit($filePath);
            }

            $command = "D:/phantomjs/bin/phantomjs D:/phantomjs/bin/snap.js {$url} {$filePath}";  //这个地方是真正调用phantomjs这个程序的。使用路径来实现调用
            @exec($command);

            exit($filePath);
        }
    }
}

最后一步就是写一个路由 ,下面的路径就是配置路由的地方

实现代码就是

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of the routes that are handled
| by your application. Just tell Laravel the URIs it should respond
| to using a Closure or controller method. Build something great!
|
*/

Route::get(‘/‘, function () {
    return view(‘welcome‘);
});

Route::any(‘test1‘,[‘uses‘=>‘[email protected]‘]);   //配置路由

代码就写到这里了,现在来看看实现效果,输入任意网址并点击生成快照,图片就会生成到下方。

最后 ,图片保存到该目录下

截屏功能就告一段落了,不过还是有很多需要优化的地方。

在实现这个的过程中,真的遇到不少的困难。比如怎么整合phantomjs与laravel框架,部署服务器上如何解决跨域问题等等。

示例:http://120.77.171.182:8080/laravel&phantomjs/public/ ,可以在这看看效果。

时间: 2024-08-07 08:19:24

使用laravel框架与phantomjs实现截屏功能的相关文章

Android自己定义截屏功能,相似QQ截屏

由于公司业务需求 须要对一个屏幕进行截屏.但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 .须要的像QQ那样截屏之后 ,能够看到我们自己定义的工具.有画笔,button等等 .android自带的功能非常easy,仅仅须要Intent隐式调用就全然足够了.但他是系统的应用 ,界面固定.无法定制改动.实现方法跟办法有非常多种,以下记录下我实现的方法 .我是这样一个思路 ,重写一个View组件 ,在OnDraw里面仅仅负责不绘图形(包含半透明的四个矩形,亮框矩形,亮框上的四个小圆点

通过view.getDrawableCache实现截屏功能

最近公司要做一些需要截屏的APP,职场菜鸟什么都不会,于是就在网上找了些资料.东拼西凑的大致了解了一下,其实还是很简单的,但是尝试的过程中遇到了一些些小问题,于是就想到要不要记录下来,于是就有了这篇文章.技术小白,大神请无视. 就如网上到处都能搜到的view.getDrawableCache()的用法一样,在调用view.getDrawableCache()之前需要调用view.setDrawingCacheEnabled(true)的方法,设置为true之后返回的bitmap就不会是null,

Atitit截屏功能的设计解决方案

自己实现.... 使用快捷键.. 弹出自己的win,,背景是屏幕快照 点击鼠标光标变成十字状态 出现截屏窗口调整截屏窗口位置与大小 释放鼠标,三个btn,,  复制到clip,取消,保存文件..双击,退出截屏窗口..与back win... 使用C:\360Downloads\Software\屏幕截图精灵_1.0\screener_plugin.exe 走ok paip.截屏功能流程说明 点击"开始截屏",出现MASC层将下边的窗口灰掉鼠标光标变成十字状态单击鼠标,出现截屏窗口调整截

java swing开发的图像生成器demo实例源代码下载,实现绘制图像,截屏功能。

一个类似于画画的javase程序 绘制图形 原文:java swing开发的图像生成器demo实例源代码下载,实现绘制图像,截屏功能. java源代码下载地址:http://www.zuidaima.com/share/1550463330028544.htm 获取屏幕 打开调色板

Android自定义截屏功能,类似QQ截屏

因为公司业务需求 需要对一个屏幕进行截屏,但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 ,需要的像QQ那样截屏之后 ,可以看到我们自定义的工具,有画笔,按钮等等 .android自带的功能非常简单,只需要Intent隐式调用就完全足够了,但他是系统的应用 ,界面固定,无法定制修改.实现方法跟办法有很多种,下面记录下我实现的方法 .我是这样一个思路 ,重写一个View组件 ,在OnDraw里面只负责不画图形(包括半透明的四个矩形,亮框矩形,亮框上的四个小圆点),Ontouch方

小胖说事22-----iOS开发技巧之取消键盘响应和截屏功能

1.UILable内容模糊 在非Retina的iPad mini 的屏幕上,一个UILable的frame的origin值如果是有小数位(如0.5),就会造成显示模糊,所以最好还是用整数值的origin. 2.取消键盘响应 取消键盘响应事件,一般都会用到resignFirstResponder,但是还有三种方法可以取消键盘的响应. 第一种:重载UIViewcontroller中的touchesBegin方法,然后在里边执行 [self.view endEditing:YES]:这样单击UIVie

Cocos2d-x 截屏功能集成

1.集成到Director这里选择把截屏功能继承到Director中,让全局的导演来执行截屏功能是一个很好的主意. void Director::saveScreenshot(const std::string& fileName,const std::function<void(const std::string&)>& callback) { Image::Format format; //进行后缀判断 if(std::string::npos != fileNam

Java实现网页截屏功能(基于phantomJs)

公司最近有个需求:把用户第一次的测量身体信息和最近一次测量信息进行对比,并且需要把对比的数据截成图片可以发给用户(需要在不打开网页的情况下实时对网页进行截图然后保存到服务器上,返回图片地址),通过网上的一些文章可以发现有以下几种实现方式:参考文章https://blog.csdn.net/wanglq0086/article/details/60761614 Robot 利用JNI,调用第三方C/C++组件 DJNativeSwing组件 利用html2canvas 利用html2image p

pytest框架优化——将异常截屏图片加入到allure报告中

痛点分析: 在做allure定制化的时候,关于附件添加这一块,我们在代码里可以添加我们准备好的附件,这里用图片,通过下面的方法就能实现 allure.attach(file, '图片描述', allure.attachment_type.PNG) 那如果我们执行测试用例生成的allure测试报告中,能把失败或者异常的测试用例的异常截图也自动添加到allure报告中,岂不更完美? 问题思考: 1.用例执行完后,异常截图图片都在OutPus目录下,怎么去跟用例关联? 2.用什么方法去添加到allur