PHP识别用户上传的色情图片并防止实例

 更新时间:2016年11月25日 15:38  点击:1330
本实例教程我们来学习一下如何用PHP识别用户上传的成人照片或者裸图,其原理就是分析一张图片的颜色是否和人类皮肤颜色大面积相似。

我在phpclasses.org上面偶然发现一个很有用的,由Bakr Alsharif开发的可以帮助开发者基于皮肤像素点来检测图片裸照的类文件.

它会分析在一张图片的不同部分使用的颜色,并决定其是否匹配人类皮肤颜色的色调.
作为分析的结果,他会返回一个反映图片包含裸露的可能性的分值.
此外,他还可以输出被分析的图片,上面对使用给定颜色的肤色的像素进行了标记.

当前它可以对PNG,GIF和JPEG图片进行分析.

PHP

下面展示了如何使用这个PHP类.

让我们先从包含裸体过滤器,nf.php文件开始.

 代码如下 复制代码
include ('nf.php');


接下来,创建一个新的名叫ImageFilter的类,然后把它放到一个叫做$filter的变量中.
   

 代码如下 复制代码
$filter = new ImageFilter;


获取图片的分值并将其放到一个$score变量中.

$score = $filter -> GetScore($_FILES['img']['tmp_name']);

如果图片分值大于或等于60%,那就展示一条(告警)消息.

 代码如下 复制代码
if($score >= 60){
/*Message*/
}

下面是所有的PHP代码:

 代码如下 复制代码
<?php
/*Include the Nudity Filter file*/
include ('nf.php');
/*Create a new class called $filter*/
$filter = new ImageFilter;
/*Get the score of the image*/
$score = $filter -> GetScore($_FILES['img']['tmp_name']);
/*If the $score variable is set*/
if (isset($score)) {
    /*If the image contains nudity, display image score and message. Score value if more than 60%, it is considered an adult image.*/
    if ($score >= 60) {
        echo "Image scored " . $score . "%, It seems that you have uploaded a nude picture.";
    /*If the image doesn't contain nudity*/   
    } else if ($score < 0) {
        echo "Congratulations, you have uploaded an non-nude image.";
    }
}
?>

标记语言

我们可以使用一个基础的HTML表单上传图片.

 代码如下 复制代码
<form method="post" enctype="multipart/form-data" action="<?php echo $SERVER['PHP_SELF'];?> ">
Upload image:
<input type="file" name="img" id="img" />
<input type="submit" value="Sumit Image" />
</form>


总结

请记得,PHP不能够检测所有的裸体图片,所以不完全可信.我希望你觉得这还有点用处.

图片操作在网站的应用相当广范,特别是现在互联网高度发达,很多内容都是以图片来显示,现在我们来讲讲用php来操作上传的图片,3D图片绘制、图片缩放、图片旋转、图片裁剪、图片添加水印。

1、利用php gd库的函数绘制3D扇形统计图

 

 代码如下 复制代码
<?php
header("content-type","text/html;charset=utf-8");
/*扇形统计图*/
$image = imagecreatetruecolor(100, 100);    /*创建画布*/
/*设置画布需要的颜色*/
$white = imagecolorallocate($image,0xff,0xff,0xff);
$gray = imagecolorallocate($image, 0xc0, 0xc0, 0xc0);
$darkgray = imagecolorallocate($image, 0x90, 0x90, 0x90);
$navy = imagecolorallocate($image, 0x00, 0x00, 0x80);
$darknavy = imagecolorallocate($image, 0x00, 0x00, 0x50);
$red = imagecolorallocate($image, 0xff, 0x00, 0x00);
$darkred = imagecolorallocate($image, 0x90, 0x00, 0x00);

/*填充背景色*/
imagefill($image, 0, 0, $white);

/*3D制作*/
for($i = 60; $i > 50; $i--)
{
    imagefilledarc($image, 50, $i, 100, 50, -160, 40, $darknavy, IMG_ARC_PIE);
    imagefilledarc($image, 50, $i, 100, 50, 40, 75, $darkgray, IMG_ARC_PIE);
    imagefilledarc($image, 50, $i, 100, 50, 75, 200, $darkred, IMG_ARC_PIE);
}

/*画椭圆弧并填充*/
imagefilledarc($image, 50, 50, 100, 50, -160, 40, $darknavy, IMG_ARC_PIE);
imagefilledarc($image, 50, 50, 100, 50, 40, 75, $darkgray, IMG_ARC_PIE);
imagefilledarc($image, 50, 50, 100, 50, 75, 200, $darkred, IMG_ARC_PIE);


/*画字符串*/
imagestring($image, 3, 15, 55, "30%", $white);
imagestring($image, 3, 45, 35, "60%", $white);
imagestring($image, 3, 60, 60, "10%", $white);

/*输出图像*/
header("content-type:image/png");
imagepng($image);

/*释放资源*/
imagedestroy($image);
?>


2、对图片进行缩放

 代码如下 复制代码
<div>
    <h4>原图大小</h4>
    <img src="1.png" style="border:1px solid red;">
</div>

<?php
header("content-type","text/html;charset=utf-8");

/*
 *图片缩放
 *@param string $filename   图片的url
 *@param int    $width      设置图片缩放的最大宽度
 *@param int    $height     设置图片缩放的最大高度
 */
function thumb($filename,$width=130,$height=130)
{
    /*获取原图的大小*/
    list($width_orig,$height_orig) = getimagesize($filename);

    /*根据参数$width和$height,换算出等比例的高度和宽度*/
    if($width && ($width_orig < $height_orig))
    {
        $width = ($height / $height_orig) * $width_orig;
    }
    else
    {
        $height = ($width / $width_orig) * $height_orig;
    }

    /*以新的大小创建画布*/
    $image_p = imagecreatetruecolor($width, $height);

    /*获取图像资源*/
    $image = imagecreatefrompng($filename);

    /*使用imagecopyresampled缩放*/
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

    /*保存缩放后的图片和命名*/

    imagepng($image_p,'test.png');

    /*释放资源*/

    imagedestroy($image_p);
    imagedestroy($image);
}

/*调用函数*/
thumb('1.png');
?>

<div>
    <h4>缩放后的大小</h4>
    <img src="test.png" style="border:1px solid red;">
</div>


3、PHP对图像的裁剪

 代码如下 复制代码
<div>
    <h4>裁剪之前</h4>
    <img src="1.png" style="border:1px solid red;">
</div>

<?php
header("content-type","text/html;charset=utf-8");
/*
*图片裁剪
*@param string $filename   图片的url
*@param int    $width      图片裁剪宽度
*@param int    $height     图片裁剪高度
*@param int    $x          裁剪图片左边开始的位置
*@param int    $y          裁剪图片顶边开始的位置
*/
function cut($filename,$x,$y,$width,$height)
{
    /*获取图像资源,需要裁剪的图片*/
    $image = imagecreatefrompng($filename);

    /*以新的大小创建画布,保存裁剪后的图片*/

    $image_p = imagecreatetruecolor($width, $height);

    /*使用imagecopyresampled缩放*/
    imagecopyresampled($image_p, $image, 0, 0, $x, $y, $width, $height, $width, $height);
    /*保存裁剪后的图片和命名*/
    imagepng($image_p,'test1.png');
    /*释放资源*/
    imagedestroy($image_p);
    imagedestroy($image);
}

/*调用函数*/
cut('1.png',20,20,80,80);           
?>

<div>
    <h4>裁剪之后</h4>
    <img src="test1.png" style="border:1px solid red;">
 </div>

4、PHP为图像添加水印

 代码如下 复制代码
<div>
    <h4>没有水印</h4>
    <img src="1.png" style="border:1px solid red;">
</div>

<?php
header("content-type","text/html;charset=utf-8");
/*
*给背景图片添加水印,背景图片格式png,水印格式gif
*@param string $filename   图片的url
*@param string $water      水印图片
*/
function watermark($filename,$water)
{
    /*获取原图的大小*/
    list($b_w,$b_h) = getimagesize($filename);
    /*获取水印图片的大小*/
    list($w_w,$w_h) = getimagesize($water);
    /*在背景图片中放水印图片的随机起始位置*/
    $posX =rand(0,($b_w - $w_w));
    $posY =rand(0,($b_h - $w_h));
    /*获取图像资源,需要裁剪的图片*/
    $back = imagecreatefrompng($filename);
    $water =  imagecreatefromgif($water);
    /*使用Inagecopy函数复制水印图片到指定位置*/
    imagecopy($back, $water, $posX, $posY, 0, 0, $w_w, $w_h);
    /*保存带水印的图片和命名*/
    imagepng($back,'test2.png');
    /*释放资源*/
    imagedestroy($back);
    imagedestroy($water);
}

/*调用函数*/
watermark('1.png','test.gif');           
?>

<div>
    <h4>加上水印</h4>
    <img src="test2.png" style="border:1px solid red;">
 </div>

 

以前我们写过一个 HP通过链式操作将数据输出excel(csv)格式,最近项目又要导出excel,由于项目中要导出excel的地方太多,因此写个类便于管理使用。

以前我们写过一个PHP通过链式操作将数据输出excel(csv)格式,http://www.111cn.net/phper/php-cy/72796.htm,现在我们来学习写一个php基于phpexcel制作的导出excel类

 代码如下 复制代码
<?php
/*
*@使用方法。
*引入类库。
*$excel = news excelC();
*$excel->fileName = '文件名称';//设置文件名称,默认为时间戳
*$excel->format = '2007';//文件类型,默认为2007,其他为excel5
*$record = array(
    'delKey'=>array('id','addTime','status'),//如果数据$data中有不需要显示的列,可以在此说明。删除不需要导出的键值
    'sort'          =>array(
                    'keyName'=>array('subjectName','flag'),//按keyName列排序,如果不存在则不排序。
                    //'reorder'=>'DESC',//排序方式,DESC为倒序,ASC为正序。如果keyName存在则排序keyName,如果不存在则按数组的键名排序,如果reorder不存在则不排序
                ),//排序   如果sort存在则排序,否则不排序,如果keyName存在则按设置排序,如果不存在则按字符排序,如果reorder不存在或为空或为DES则正序,等于DESC为倒序。
    'excelStyle'    =>array(
                        'setName'=>'Arial',//字体样式
                        'setSize'=>'12',//字体大小
                    ),//表格全局样式
    'title'         =>array('tableName'=>'学科列表','center'=>true,'direction'=>'right','merge'=>'2','setSize'=>'30'),//标题,center垂直,direction为合并方向。right,left,up,down。 merge为合并几个单元格,setSize为字体大小
    'data'          =>array(
                        array('tableName'=>'科目名称','width'=>'30','setName'=>'宋体','setSize'=>'20','background'=>'red','textColor'=>'white','bold'=>true,'underline'=>true,'borderColor'=>'cyan','center'=>true,),
                        array('tableName'=>'学科','width'=>'50','center'=>true),//颜色表是:black,white,red,green,blue,yellow,magenta,cyan
                    ),//表名称 tableName为名称,width为表格宽度,setName为字体样式,background为背景颜色,textColor为字体颜色,bold为加粗,underline为下划线,borderColor为边框颜色.
    'merge'         =>array(
                        //'flag'=>array('keyword'=>'初','direction'=>'right','merge'=>'2'),merge的键值为需要处理数据数组的键值,keyword为如果存在此关键字才执行其他样式操作,如果keyword不存在则执行所有键值为flag的单元格。
                        'all'=>array('width'=>'30','setName'=>'宋体','setSize'=>'20','background'=>'red','textColor'=>'white','bold'=>true,'underline'=>true,'borderColor'=>'cyan','center'=>true,),
                    ),//
);//导出配置
 
 
*$excel->export($record,$data);//$record为导出配置,$data为数据库的数据,$data可以为数组,也可以为对象。
*
*
*
*/
$address = dirname(dirname(__FILE__)).'/PHPExcel';
include $address.'/PHPExcel.class.php';
include $address.'/PHPExcel/Writer/Excel2007.php';
include $address.'/PHPExcel/Writer/Excel5.php';
include $address.'/PHPExcel/IOFactory.php';
 
/****************************
*生成excel文档。
*/
 
class excelC {
    
    public $format = '2007';//转换格式,默认为2007版本,其他版本,请输入不是2007的数字
    
    public $fileName;//文件名称默认为时间戳。
    
    
    private $objExcel;
    
    private $letters;
    
    public function __construct()
    {
        $this->fileName = time();
        
        $this->fileTitle = '导出数据';
        
        $this->objExcel = new PHPExcel();
        $this->letters = $this->letter();
    }
    
    
    //导出excel的属性
    private function attribute(){
        
        
        $this->objExcel->getProperties()->setCreator("力达行有限公司");//创建人
        
        $this->objExcel->getProperties()->setLastModifiedBy("力达行有限公司");//最后修改人
        
        $this->objExcel->getProperties()->setTitle("导出数据");//标题
        
        $this->objExcel->getProperties()->setSubject("导出数据");//题目
        
        $this->objExcel->getProperties()->setDescription("数据导出");//描述
        
        $this->objExcel->getProperties()->setKeywords("office 导出");//关键字
        
        $this->objExcel->getProperties()->setCategory("excel");//种类
    }
    
    
    
    //设置表(如果只有一个sheet可以忽略该函数,将默认创建。)
    private function sheet(){
        
        $this->objExcel->setActiveSheetIndex(0);//设置当前的表
        
        $this->objExcel->getActiveSheet()->setTitle('excel');//设置表名称。
    }
    
    
    /***************************
    *导出excel
    *@attr $record为表头及样式设置
    *@attr $data为需要导出的数据
    */
    public function export($record=array(),$data=array()){
        if(!$data)return false;
        if(!is_array($record))return false;//表样式及其他设置
        
        //处理获取到的数据
        $data = $this->maniData($record,$data);
        
        //获取整体样式。
        $this->excelData($record,$data);
        
        
        //$this->objExcel->getActiveSheet()->setCellValue('A1', '季度');
        
        $this->down();//导出下载
    }
    
    
    /*
    *处理表格
    */
    private function excelData(&$record,&$data){
        $this->attribute();//设置属性
        $this->sheet();//设置表
        $this->whole($record);//设置整体样式
        $this->tableHeader($record);//设置表格头。
        $this->tableContent($record,$data);//设置表格
        $this->excelTitle($record,2);//设置标题
    }
    
    /*
    *设置表格整体样式
    */
    private function whole(&$record){
        if(!array_key_exists('excelStyle',$record))return false;
        
        $excelStyle = $record['excelStyle'];
        
        $default = $this->objExcel->getDefaultStyle();
        
        if(array_key_exists('setName',$excelStyle))
            $default->getFont()->setName($excelStyle['setName']);//设置字体样式
            
        if(array_key_exists('setSize',$excelStyle))
            $default->getFont()->setSize($excelStyle['setSize']);//设置字体大小
    }
    
    /*
    *设置标题
    */
    private function excelTitle($record,$num){
        $titleL = $this->letters[0];
        if(!array_key_exists('title',$record))return false;
        $this->appOintStyle($titleL ,1,$record['title']);
        
    }
    
    /*
    *设置表格头。
    */
    private function tableHeader($record){
        if(!array_key_exists('data',$record))return false;
        $objExcel = $this->objExcel;
        $letters = $this->letters;
        
        if(!is_array($record['data']))return false;
        
        $i = 0;
        $hang = 2;
        foreach($record['data'] as $k=>$v){
        
            $this->appOintStyle($letters[$i],$hang,$v);
                
            $i++;
        }
        
    }
    
    private function setCellValue($letter,$data){
    
        if(@$data)
            $this->objExcel->getActiveSheet()->setCellValue($letter, $data);//填充值
        
        return $this;
    }
    
    private function getColumnDimension($letter,$data){
    
        if(@$data)
            $this->objExcel->getActiveSheet()->getColumnDimension($letter)->setWidth($data);//设置宽度
            
        return $this;
    }
    
    private function setName($letter,$data){
    
        if(@$data)
            $this->objExcel->getActiveSheet()->getStyle($letter)->getFont()->setName($data);//设置字体
            
        return $this;
    }
    
    private function setSize($letter,$data){
    
        if(@$data)
             $this->objExcel->getActiveSheet()->getStyle($letter)->getFont()->setSize($data);//设置字体大小
            
        return $this;
    }
    
    private function background($letter,$data){
    
        if(@$data){
            $this->objExcel->getActiveSheet()->getStyle($letter)->getFill()->getStartColor()->setARGB($this->backColor($data));
            $this->objExcel->getActiveSheet()->getStyle($letter)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);//设置背景色样式,无样式将不显示背景色。
        }
            
        return $this;
    }
    
    private function textColor($letter,$data){
    
        if(@$data){
            $this->objExcel->getActiveSheet()->getStyle($letter)->getFont()->getColor()->setARGB($data);//字体颜色
        }
            
        return $this;
    }
    
    private function setBold($letter,$data){
    
        if(@$data){
            $this->objExcel->getActiveSheet()->getStyle($letter)->getFont()->setBold(true);//加粗
        }
            
        return $this;
    }
    
    private function setUnderline($letter,$data){
    
        if(@$data){
            $this->objExcel->getActiveSheet()->getStyle($letter)->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);//下划线
        }
            
        return $this;
    }
    
    private function border($letter,$data){
    
        if(@$data){
            $styleThinBlackBorderOutline = array(
                           'borders' => array (
                                 'outline' => array (
                                       'style' => PHPExcel_Style_Border::BORDER_THIN, //设置border样式
                                       'color' => array ('argb' => $data),          //设置border颜色
                                ),
                          ),
                    );
            $this->objExcel->getActiveSheet()->getStyle($letter)->applyFromArray($styleThinBlackBorderOutline);
        }
            
        return $this;
    }
    
    /*
    *合并
    */
    private function mergeCells($letters,$hang,$direction,$merge){
        
        $merge = $merge-1;
        
        if($merge > 0 && $direction){
        
            //print_r($this->letters);
            $l = array_flip($this->letters);
            $ln = $l[$letters];
            
            switch ($direction)
            {
                case 'left':
                    $signal = $this->letters[($ln-$merge)].$hang.':'.$letters.$hang;
                break;
                case 'right':
                    $signal = $letters.$hang.':'.$this->letters[($ln+$merge)].$hang;
                break;
                case 'up':
                    $signal = $letters.($hang-$merge).':'.$letters.$hang;
                break;
                case 'down':
                    $signal = $letters.$hang.':'.$letters.($hang+$merge);
                break;
                default:
                    $signal = '';
            }
            
            if($signal){
                $this->objExcel->getActiveSheet()->mergeCells($signal);
            }
            
        }
        
        return $this;
    }
    
    /*
    *垂直居中
    */
    private function setVertical($letter,$data){
        
        if($data){
            $this->objExcel->getActiveSheet()->getStyle($letter)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $this->objExcel->getActiveSheet()->getStyle($letter)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        }
        return $this;
        
    }
    
    
    
    
    
    
    
    
    
    /*
    *设置颜色
    */
    private function backColor($color){
        
        $array = array(
            'black' => 'FF000000',   //  System Colour #1 - Black
            'white' => 'FFFFFFFF',   //  System Colour #2 - White
            'red'   => 'FFFF0000',   //  System Colour #3 - Red
            'green' => 'FF00FF00',   //  System Colour #4 - Green
            'blue'  => 'FF0000FF',   //  System Colour #5 - Blue
            'yellow'    => 'FFFFFF00',   //  System Colour #6 - Yellow
            'magenta'   => 'FFFF00FF',   //  System Colour #7- Magenta
            'cyan'  => 'FF00FFFF',   //  System Colour #8- Cyan
        );
        if(array_key_exists($color,$array)){
            return $array[$color];
        } else {
            return false;
        }
                    
    }
    /*
    *设置表
    */
    private function tableContent(&$record,&$data){
        $objExcel = $this->objExcel;
        $letters = $this->letters;
        
        if(array_key_exists('merge',$record))
            $merge = $record['merge'];
        else
            $merge = '';
                    
        $hang = 2;
        foreach($data as $k=>$v){
            $i=0;
            $hang++;
            
            foreach($v as $kk=>$vv){
                $this->setCellValue($letters[$i].$hang, $vv);//设置内容
                $this->Appoint($kk,$vv,$letters[$i],$hang,$merge);
                $i++;
            }
            
        }
    }
    
    /*
    *设置表指定样式
    */
    private function Appoint($kk,$vv,$letters,$hang,$merge){
        if(!$merge)return false;
        if(array_key_exists($kk,$merge)){
            $v = $merge[$kk];
            if(array_key_exists('keyword',$v)){
            
                if(strpos($vv,$v['keyword']) > -1){
                    $this->appOintStyle($letters,$hang,$v);
                }
                
            } else {
                $this->appOintStyle($letters,$hang,$v);
            }
        } else if(array_key_exists('all',$merge)){
            $v = $merge['all'];
            if(array_key_exists('keyword',$v)){
            
                if(strpos($vv,$v['keyword']) > -1){
                    $this->appOintStyle($letters,$hang,$v);
                }
                
            } else {
                $this->appOintStyle($letters,$hang,$v);
            }
        }
    }
    
    /*
    *终极样式
    */
    private function appOintStyle($letters,$hang,$v){
    
        $this
                ->setCellValue($letters.$hang,@$v['tableName'])
                ->getColumnDimension($letters,@$v['width'])
                ->setName($letters.$hang,@$v['setName'])
                ->setSize($letters.$hang,@$v['setSize'])
                ->background($letters.$hang,@$v['background'])
                ->textColor($letters.$hang,$this->backColor(@$v['textColor']))
                ->setBold($letters.$hang,@$v['bold'])
                ->setUnderline($letters.$hang,@$v['underline'])
                ->border($letters.$hang,$this->backColor(@$v['borderColor']))
                ->mergeCells($letters,$hang,@$v['direction'],@$v['merge'])
                ->setVertical($letters.$hang,@$v['center']);
    }
    
    /*
    *应为字母列表
    */
    public function letter(){
        return array('A','B','C','D','F','G','H','I','G','K','L','M','N','O','P','Q','R','S','T','U','V','W','H','Y','Z');
    }
    
    /****************************
    *处理数据,排序及删除字段
    */
    private function maniData($record,$data){
        if(!$data)return false;
        if(!is_array($record))return false;//表样式及其他设置
    
        $data = $this->objectToArray($data);//对象转数组
        
        $delKey = (array_key_exists('delKey',$record))?$record['delKey']:'';//是否删除关键字
        $sort = (array_key_exists('sort',$record))?$record['sort']:'';//是否排序
        $data = $this->delSort($data,$delKey,$sort);
        return $data;
    }
    
    /****************************
    *对象转数组
    */
    private function objectToArray($data){
        if(!$data)return false;
        $data = (array)$data;
        
        foreach($data as $k=>$v){
            if(is_object($v) || is_array($v)){
                $data[$k] = (array)$this->objectToArray($v);
            }
        }
        return $data;
    }
    
    /****************************
    *删除键值,并排序
    */
    private function delSort($data,$delKey='',$sort=''){
    
        if(!$data)return false;
        
        $array = array();
        foreach($data as $k=>$v){
        
            //删除数据中的某个键值
            $delData = $this->delData($v,$delKey);
            //按设定键值排序
            $sortData = $this->sortData($delData,$sort);
            $array[$k] = $sortData;
        }
        
        return $array;
        
    }
    
    /****************************
    *删除键值
    */
    public function delData($data,&$delKey){
        if($delKey){
            foreach($delKey as $delVal){
                if(array_key_exists($delVal,$data))//判断键值是否存在
                    unset($data[$delVal]);//清除键名。
            }
        }
        return $data;
    }
    
    /****************************
    *键值排序
    */
    public function sortData($data,&$sort){
        $array = array();
        if($sort){
            if(array_key_exists('keyName',$sort)){
                $keyName = $sort['keyName'];
                if(array_key_exists('reorder',$sort)){
                    if($sort['reorder'] == 'DESC'){
                        krsort($keyName);
                    } else if($sort['reorder'] == 'ASC'){
                        ksort($keyName);
                    }
                }
                foreach($keyName as $vn){
                    $array[$vn] = (array_key_exists($vn,$data))?$data[$vn]:'';
                }
            } else {
                if(array_key_exists('reorder',$sort)){
                    if($sort['reorder'] == 'DESC'){
                        krsort($data);
                    } else if($sort['reorder'] == 'ASC'){
                        ksort($data);
                    }
                    $array = $data;
                }
            }
            
        }
        return $array;
    }
    
    
    
    //导出下载
    private function down(){
        
        if($this->format == '2007'):
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
            $excel = 'Excel2007';
        else:
            header('Content-Type: application/vnd.ms-excel');
            $excel = 'Excel5';
        endif;
        
        header("Content-Disposition: attachment; filename="$this->fileName"");
        header('Cache-Control: max-age=0');
        
        $objWriter = PHPExcel_IOFactory::createWriter($this->objExcel, $excel);
 
        $objWriter->save('php://output');
        
    }
}
最近做的项目要实现跨平台,项目用的是utf-8的编码,由于在操作过程中出现各种编码问题,于是就把utf-8编码转成能够使计算机实现跨语言、跨平台的文本转换及处理的unicode编码。

对于这种问题,我们还是直接上代码来的快,大伙拿去直接用吧,不要谢我。

 代码如下 复制代码
public function utf8_unicode($str) {
    $unicode = array();
    $values = array();
    $lookingFor = 1;

    for ($i = 0; $i < strlen( $str ); $i++ ) {
        $thisValue = ord( $str[ $i ] );
        if ( $thisValue < ord('A') ) {
            // exclude 0-9
            if ($thisValue >= ord('0') && $thisValue <= ord('9')) {
                 // number
                 $unicode[] = chr($thisValue);
            }
            else {
                 $unicode[] = '%'.dechex($thisValue);
            }
        } else {
            if ( $thisValue < 128) {
                $unicode[] = $str[ $i ];
            } else {
                if ( count( $values ) == 0 ) {
                    $lookingFor = ( $thisValue < 224 ) ? 2 : 3;
                }
                $values[] = $thisValue;
                if ( count( $values ) == $lookingFor ) {
                    $number = ( $lookingFor == 3 ) ?
                        ( ( $values[0] % 16 ) * 4096 ) + ( ( $values[1] % 64 ) * 64 ) + ( $values[2] % 64 ):
                        ( ( $values[0] % 32 ) * 64 ) + ( $values[1] % 64 );
                    $number = dechex($number);
                    $unicode[] = (strlen($number)==3)?"u0".$number:"u".$number;
                    $values = array();
                    $lookingFor = 1;
                } // if
            } // if
        }
    } // for
    return implode("",$unicode);
}
CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的。现在我们来学习用PHP链式操作输出excel(csv)格式。

工作中经常会遇到产品运营让导出一些简单的比较规范的数据,这时候要是有一个简单的方法可以用就简单多了。下面是我的一个输出简单的excel(csv)的方法类,用到了链式操作。说到链式操作,在jquery中可能经常用到,是不是也感觉到链式操作用起来很爽,我们也在这个类中实现下链式操作。

其实链式操作很简单的,就是在前一个类方法最后返回一个该类的对象($this),提供给下一个方法调用。

 代码如下 复制代码
<?php
class Array2csv{
    /*
     *@var string $ext 扩展名
     */
    private $ext = 'csv';

    /**
     * @desc构造方法
     * @param string $filename 要输出的文件名
     * @param string $ext 扩展名
     */
    public function __construct($filename,$ext=null){
        ob_start();
        header("Content-type: text/html;charset=utf-8");
        header("Content-type: application/x-csv");
        if(PHP_SAPI == 'cli') echo "CLI模式下不能导出csv文件r";
        $this->ext = $ext === null ? $this->ext : $ext;
        header("Content-Disposition: attachment;filename=".$filename.".".$this->ext);
        ob_flush();
        return $this;
    }

    /**
     * @desc 打印excel标题
     * @param array $title 要输出的标题行
     * @param object Array2csv 对象本身
     */   
    public function title($title){
        $title = implode(",", $title);
        echo $title."n";
        return $this;
    }

    /**
     * @desc 打印一行excel内容
     * @param array $body 要输出的内容
     * @param object Array2csv 对象本身
     */   
    public function body($body){
        if(!is_array($body) || empty($body)) {
            return false;
        }
        $body = implode(",", $body);
        echo $body."n";
        return $this;
    }

    /**
     * @desc 打印多行excel内容
     * @param array $bodyArr 要输出的多行内容
     * @param object Array2csv 对象本身
     */   
    public function multiBody($bodyArr){
        if(!is_array($bodyArr) || empty($bodyArr)) return false;

        foreach ($bodyArr as $key => $value) {
            if(is_array($value)){
                $value = implode(",", $value);
                echo $value."n";
            }
        }
        return $this;
    }
}


$test = new Array2csv('test');
$arr = array(
    array('luluyrt@163.com','奔跑的Man1','奔跑的userman'),
    array('luluyrt@163.com','奔跑的Man2','奔跑的userman'),
    array('luluyrt@163.com','奔跑的Man3','奔跑的userman'),
    array('luluyrt@163.com','奔跑的Man4','奔跑的userman'),
    array('luluyrt@163.com','奔跑的Man5','奔跑的userman'),
    array('luluyrt@163.com','奔跑的Man6','奔跑的userman')
);
$test->title(array('测试','呵呵','哈哈'))->body(array('100,sadkl','sdsas','sdvsvdd分'))->multiBody($arr);



输出的csv如下图所示:

 

HP通过链式操作将数据输出excel(csv)格式

但是这里面有个问题,从编码是utf-8的数据库中取出来的汉字输出excel(csv)会乱码,这个时候你要注意,要在获取数据之前设置数据库的编码,比如说我的需要的是utf-8进行输出,这个时候就要

$link = mysqli_connect($host, $user, $passwd, $db);
mysqli_query($link, "set names utf8");

进行编码转换方可正常显示,下面是我的数据库信息和编码前后效果:

HP通过链式操作将数据输出excel(csv)格式

数据库信息

HP通过链式操作将数据输出excel(csv)格式HP通过链式操作将数据输出excel(csv)格式

设置数据库编码前后的对比

[!--infotagslink--]

相关文章

  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • Photoshop古装美女图片转为工笔画效果制作教程

    今天小编在这里就来给各位Photoshop的这一款软件的使用者们来说说把古装美女图片转为细腻的工笔画效果的制作教程,各位想知道方法的使用者们,那么下面就快来跟着小编一...2016-09-14
  • php 获取用户IP与IE信息程序

    php 获取用户IP与IE信息程序 function onlineip() { global $_SERVER; if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP');...2016-11-25
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮

    jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮...2013-10-13
  • 利用JS实现点击按钮后图片自动切换的简单方法

    下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • Photoshop枪战电影海报图片制作教程

    Photoshop的这一款软件小编相信很多的人都已经是使用过了吧,那么今天小编在这里就给大家带来了用Photoshop软件制作枪战电影海报的教程,想知道制作步骤的玩家们,那么下面...2016-09-14
  • js实现上传图片及时预览

    这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
  • python opencv通过4坐标剪裁图片

    图片剪裁是常用的方法,那么如何通过4坐标剪裁图片,本文就详细的来介绍一下,感兴趣的小伙伴们可以参考一下...2021-06-04
  • php根据用户语言跳转相应网页

    当来访者浏览器语言是中文就进入中文版面,国外的用户默认浏览器不是中文的就跳转英文页面。 <&#63;php $lan = substr(&#8194;$HTTP_ACCEPT_LANGUAGE,0,5); if ($lan == "zh-cn") print("<meta http-equiv='refresh' c...2015-11-08
  • 使用PHP下载CSS文件中的图片的代码

    共享一段使用PHP下载CSS文件中的图片的代码 复制代码 代码如下: <?php //note 设置PHP超时时间 set_time_limit(0); //note 取得样式文件内容 $styleFileContent = file_get_contents('images/style.css'); //not...2013-10-04
  • php有效防止同一用户多次登录

    【问题描述】:同一用户在同一时间多次登录如果不能检测出来,是危险的。因为,你无法知道是否有其他用户在登录你的账户。如何禁止同一用户多次登录呢? 【解决方案】 (1) 每次登录,身份认证成功后,重新产生一个session_id。 s...2015-11-24
  • PHP swfupload图片上传的实例代码

    PHP代码如下:复制代码 代码如下:if (isset($_FILES["Filedata"]) || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] != 0) { $upload_file = $_FILES['Filedata']; $fil...2013-10-04
  • 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • C#中图片旋转和翻转(RotateFlipType)用法分析

    这篇文章主要介绍了C#中图片旋转和翻转(RotateFlipType)用法,实例分析了C#图片旋转及翻转Image.RotateFlip方法属性的常用设置技巧,需要的朋友可以参考下...2020-06-25
  • ps怎么制作图片阴影效果

    ps软件是现在很多人比较喜欢的,有着非常不错的使用效果,这次文章就给大家介绍下ps怎么制作图片阴影效果,还不知道制作方法的赶紧来看看。 ps图片阴影效果怎么做方法/...2017-07-06
  • OpenCV如何去除图片中的阴影的实现

    这篇文章主要介绍了OpenCV如何去除图片中的阴影的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-29