网络编程
位置:首页>> 网络编程>> php编程>> ecshop百度编辑器远程下载无后缀的图片,并且加水印

ecshop百度编辑器远程下载无后缀的图片,并且加水印

作者:Abner3721  发布时间:2023-08-14 17:31:41 

标签:

<?php

    /**

     * Created by JetBrains PhpStorm.

     * User: taoqili

     * Date: 11-12-28

     * Time: 上午9:54

     * To change this template use File | Settings | File Templates.

     */

    header("Content-Type: text/html; charset=utf-8");

    error_reporting(E_ERROR|E_WARNING);

    //远程抓取图片配置

    $config = array(

        "savePath" => "../../../bdimages/upload1/" ,            //保存路径

        "allowFiles" => array( ".gif" , ".png" , ".jpg" , ".jpeg" , ".bmp" ) , //文件允许格式

        "maxSize" => 3000                    //文件大小限制,单位KB

    );

    $uri = htmlspecialchars( $_POST[ 'upfile' ] );

    $uri = str_replace( "&" , "&" , $uri );

    getRemoteImage( $uri,$config );


    /**

     * 远程抓取

     * @param $uri

     * @param $config

     */

    function getRemoteImage( $uri,$config)

    {

        $tempimgUrl= '';

        //忽略抓取时间限制

        set_time_limit( 0 ); 

        //ue_separate_ue  ue用于传递数据分割符号

        $imgUrls = explode( "ue_separate_ue" , $uri );

        $tmpNames = array();

        foreach ( $imgUrls as $imgUrl ) {  

            //http开头验证

            if(strpos($imgUrl,"http")!==0){

                array_push( $tmpNames , "error" );

                continue;

            }

            //获取请求头

            $heads = get_headers( $imgUrl );

            //死链检测

            if ( !( stristr( $heads[ 0 ] , "200" ) && stristr( $heads[ 0 ] , "OK" ) ) ) {

                array_push( $tmpNames , "error" );

                continue;

            }

             

            

            //格式验证(扩展名验证和Content-Type验证)

            $ext = strtolower( strrchr( $imgUrl , '.' ) );

            //当文件后缀不能存,并且是图片类型的,自动添加文件后缀

            $imgAttr = get_headers( $imgUrl, true );

            $imgtype = array('image/png', 'image/jpeg', 'image/gif');

            

            if( !in_array( $ext, $config[ 'allowFiles' ] ) && in_array($imgAttr['Content-Type'],  $imgtype)){ 


                switch( $imgAttr['Content-Type'] )

                {

                    case 'image/png' :

                        $ext = '.png';

                        break;

                    case 'image/jpeg' :

                        $ext = '.jpg';

                        break;

                    case 'image/gif' :

                        $ext = '.gif';

                        break;

                    default:

                        $ext = '.jpg';

                }

                

                //读取远程无后缀的图片内容

                $tempimgUrl = @file_get_contents( $imgUrl);

                $imgUrl = $imgUrl.$ext;

            }



            

            $fileType = $ext;

            if ( !in_array( $fileType , $config[ 'allowFiles' ] ) || stristr( $heads[ 'Content-Type' ] , "image" ) ) {

                array_push( $tmpNames , "error" );

                continue;

            }  

            //打开输出缓冲区并获取远程图片

            ob_start();

            $context = stream_context_create(

                array (

                    'http' => array (

                        'follow_location' => false // don't follow redirects

                    )

                )

            );

            //请确保php.ini中的fopen wrappers已经激活

            readfile( $imgUrl,false,$context);

            //当无后缀图片时,用读出来的数据

            $img = !empty($tempimgUrl) ? $tempimgUrl : ob_get_contents();

            ob_end_clean();


            //大小验证

            $uriSize = strlen( $img ); //得到图片大小

            $allowSize = 1024 * $config[ 'maxSize' ];

            if ( $uriSize > $allowSize ) {

                array_push( $tmpNames , "error" );

                continue;

            }

            //创建保存位置

            $savePath = $config[ 'savePath' ].date('Ymd', time()).'/';

            if ( !file_exists( $savePath ) ) {

                mkdir( "$savePath" , 0777 );

            }

            //写入文件

            $tmpName = $savePath . rand( 1 , 10000 ) . time() . strrchr( $imgUrl , '.' );

            try {

                $fp2 = @fopen( $tmpName , "a" );

                fwrite( $fp2 , $img );

                fclose( $fp2 );  

                

                //添加水印,载入水印需要的文件 @author Abner @time 20171221 start

                define('IN_ECS', true);

                define('INIT_NO_USERS', true);

                require_once( '../../init.php');

                require_once( '../../cls_image.php');

                $image = new cls_image(); 

                if (intval($_CFG['watermark_place']) > 0 && !empty($_CFG['watermark']))

                { 

                    $image->add_watermark( $tmpName , '', '../../'.$_CFG['watermark'], $_CFG['watermark_place'], $_CFG['watermark_alpha']);

                    

                }

                //添加水印,载入水印需要的文件 @author Abner @time 20171221 end

                 

                array_push( $tmpNames ,  $tmpName );

            } catch ( Exception $e ) {

                array_push( $tmpNames , "error" );

            }

        }

        /**

         * 返回数据格式

         * {

         *   'url'   : '新地址一ue_separate_ue新地址二ue_separate_ue新地址三',

         *   'srcUrl': '原始地址一ue_separate_ue原始地址二ue_separate_ue原始地址三',

         *   'tip'   : '状态提示'

         * }

         */

        

        echo "{'url':'" . implode( "ue_separate_ue" , $tmpNames ) . "','tip':'远程图片抓取成功!','srcUrl':'" . $uri . "'}";

    }

来源:https://www.cnblogs.com/Abner3721/p/8118686.html

0
投稿

猜你喜欢

  • 当你提交一个查询的时候,MySQL会分析它,看是否可以做一些优化使处理该查询的速度更快。这一部分将介绍查询优化器是如何工作的。如果你想知道M
  • MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQLAB公司,在2008年1月16号被Sun公司收购。MySQL被广泛地应用在I
  • 下面的asp函数实现了对站点的所有缓存Application的清理,释放!Sub RemoveAllCache()  D
  • 多级联动下拉选择框,动态获取下一级,每一级数据为XML,可支持无限级(浏览器端需要Microsoft.XMLDOM支持)项目需要,一个材料类
  • 我认为在ASP中最好的办法是用编程实现定时刷新Cache,也就是说给Application中储存的设一个过期时间。当然,在ASP中Appli
  • css可以处理16,777,216颜色,可以使用名字、rgb值或十六进制代码。red红色等同于 rgb(255,0,0) &nbs
  • 在网上查找大量资料,经过自己的不懈努力,终于测试成功了。原来要在服务器上安装mysql odbc 3.51 ,还有数据库用户名及密码,用下面
  • 大家应该经常看到在文本框里提示文字,然后一点就没了。通常做法都是默认给个value,通过js来处理。详细实现都不介绍了,大家都会。现在来看一
  • 玩过电脑游戏的同学对于 * 肯定不陌生,但是你在用 * 的时候有没有想过如何做一个 * 呢?(当然用 * 不是那么道义哈,呵呵),那我们就来看一下如
  • 1、在全局settings文件中配置```MEDIA_URL = '/media/'MEDIA_ROOT = os.path
  • 代码如下:<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001&quo
  • location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.hre
  • 什么是F型浏览?2006年4月,美国长期研究网站可用性的著名网站设计师杰柯柏·尼尔森(Jakob Nielsen)发表了一项《眼球轨迹的研究
  • em 和 strong 的区别,可以从三个层次上来谈。首先看 HTML 4.01 中的说明:EM: Indicates emphasis.S
  • 输入框Input 应当符合逻辑地划分为小组,这样大脑就可以很好的处理大堆区域间的关系。 ——《HTML权威指南》Web 应用程序总是利用表单
  • 以前我就是一篇博文 就给出一个好用的函数,它在我几篇博文中被广泛运用的。最近看了不少东西,于是便有了这篇博文,以梳理我学到的新东西。毫无疑问
  • WEB标准,从我大二开始接触到毕业后的第一份工作“页面重构工程师”,从接触标准到蓝色理想标准区版主的四年多时间里,WEB标准已经成为我生活中
  • 前言21世纪是信息的世纪,综合国力的竞争在很大程度上是信息的竞争,更是信息利用率的竞争。近年来,随着“数字地球”和“数字国土”战略的提出和实
  • 一直想了解Web编程的技术。PHP是进行Web编程重要的一种语言,书上总是说,PHP是用于服务器端的编程语言。但是,实在不能理解它是怎么用于
  • 今天同学向我提了一个问题,我觉得蛮有意思,现记录下来大家探讨下。问题是:在一个表里面,有一个允许为空的字段,空是可以重复的,但是不为空的值需
手机版 网络编程 asp之家 www.aspxhome.com