php中解压压缩文件实例源码

 更新时间:2016年11月25日 16:19  点击:1605
仔细的研究了一下,原来用php写的解压程序效率比想象的还是高很多的,既然这么好,干脆再优化一下后用到自己后台中,虽然现在大部分空间的控制面板中有压缩和解压这个功能,但是毕竟有时候有些麻烦。

做这个之前,没有接触过php压缩这一块,网上搜了一些,大多数都是php压缩类、压缩函数,少则几百行,多的就几千行代码。这对于我这种新手来说很摸不到头脑,再说我也不用这么复杂的功能。最后参考函数手册,理清楚了几个相关的函数后,就明白了怎么去整了。

PHP Zip File 函数
PHP Zip File 函数


记得要开启 zip ,把 php.ini 中的 extension=php_zip.dll 前面的分号去掉。


源码范例:

 代码如下 复制代码


<?php


//需开启配置 php_zip.dll

//phpinfo();

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


function get_zip_originalsize($filename, $path) {

//先判断待解压的文件是否存在

if(!file_exists($filename)){

die("文件 $filename 不存在!");

$starttime = explode(' ',microtime()); //解压开始的时间

//将文件名和路径转成windows系统默认的gb2312编码,否则将会读取不到

$filename = iconv("utf-8","gb2312",$filename);

$path = iconv("utf-8","gb2312",$path);

//打开压缩包

$resource = zip_open($filename);

$i = 1;

//遍历读取压缩包里面的一个个文件

while ($dir_resource = zip_read($resource)) {

//如果能打开则继续

if (zip_entry_open($resource,$dir_resource)) {

//获取当前项目的名称,即压缩包里面当前对应的文件名

$file_name = $path.zip_entry_name($dir_resource);

//以最后一个“/”分割,再用字符串截取出路径部分

$file_path = substr($file_name,0,strrpos($file_name, "/"));

//如果路径不存在,则创建一个目录,true表示可以创建多级目录

if(!is_dir($file_path)){

mkdir($file_path,0777,true);

}

//如果不是目录,则写入文件

if(!is_dir($file_name)){

//读取这个文件

$file_size = zip_entry_filesize($dir_resource);

//最大读取6M,如果文件过大,跳过解压,继续下一个

if($file_size<(1024*1024*6)){

$file_content = zip_entry_read($dir_resource,$file_size);

file_put_contents($file_name,$file_content);

}else{ www.111cn.net

echo "<p> ".$i++." 此文件已被跳过,原因:文件过大, -> ".iconv("gb2312","utf-8",$file_name)." </p>";

}

}

//关闭当前

zip_entry_close($dir_resource);

}

}

//关闭压缩包

zip_close($resource); 

$endtime = explode(' ',microtime()); //解压结束的时间

$thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);

$thistime = round($thistime,3); //保留3为小数

echo "<p>解压完毕!,本次解压花费:$thistime 秒。</p>";

}


$size = get_zip_originalsize('20131101.zip','1代潇瑞/');


?>


测试解压了一个300多KB的小文件,花了0.115秒,测试解压了一个30多MB的(网页文件,小文件比较多),花了20多秒。


php解压程序


跟系统比起来确实慢了一些,但是这也很不错了!刚刚入门,代码还不优良,但是实现了解压,而且代码也比网上的简介易懂,如果你看到这篇文章,相信对你是有帮助的!程序中用到了程序运行的时间,具体可以看看: 。

php解压程序


最后,我觉得:

 代码如下 复制代码

    //最大读取6M,如果文件过大,跳过解压,继续下一个

    if($file_size<(1024*1024*6)){

        $file_content = zip_entry_read($dir_resource,$file_size);

        file_put_contents($file_name,$file_content);

    }

这一块做的不太好,这样对大文件解压就没办法了,等会再优化一下。

网站安装过程我们需要几处非常简单,一个是我们要让用户输入用户名密码然后连接数据库之后再把我们以前准备好.sql文件利用php读取并执行,最后简单配置一下站点,这样一个完整的php网站安装过程就完美的搞定了。

这次顺便做了一个install.php才发现难度其实并不大,还是文件写入操作而已,安装其实主要操作的还是数据库里的内容,先来看看文件里怎么写:(还是用的Codeigiter,对于使用其他框架或者手写而言,仅思路可参考,用了挺多CI自带的helper或者是library的)

 代码如下 复制代码
 $content = "<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');n";
 $content .= '$active_group'. "= 'default';n";
 $content .= '$active_record'." = TRUE;n";
 $content .= '$db'."['default']['hostname'] = '".$this->input->post('hostname')."';n";
 $content .= '$db'."['default']['username'] = '".$this->input->post('rootname')."';n";
 $content .= '$db'."['default']['password'] = '".$this->input->post('pass')."';n";
 $content .= '$db'."['default']['database'] = '".$this->input->post('book')."';n";
 $content .= '$db'."['default']['dbdriver'] = 'mysql';n";
 $content .= '$db'."['default']['dbprefix'] = '';n";
 $content .= '$db'."['default']['pconnect'] = TRUE;n";
 $content .= '$db'."['default']['db_debug'] = TRUE;n";
 $content .= '$db'."['default']['cache_on'] = FALSE;n";
 $content .= '$db'."['default']['cachedir'] = '';n";
 $content .= '$db'."['default']['char_set'] = 'utf8';n";
 $content .= '$db'."['default']['dbcollat'] = 'utf8_general_ci';n";
 $content .= '$db'."['default']['swap_pre'] = '';n";
 $content .= '$db'."['default']['autoinit'] = TRUE;n";
 $content .= '$db'."['default']['stricton'] = FALSE;";

在文件里用n来换行,因为里面包括了PHP的代码,这导致了我们只能用双引号避免冲突(否则的话就得用了,感觉工作量更大),针对$db,直接显示必须要用单引号,于是就出现了这个。

写入文件之后,接着我们需要做的是执行一系列安装操作,也就是CREATE TABLE,以及创建一个新用户用于登陆,在model里,我这么写:

 

 代码如下 复制代码
function install() {
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_category'")) == 0)
 $this->db->query("CREATE TABLE pr_category(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, category VARCHAR(100) NOT NULL UNIQUE, deadline INT NOT NULL)");
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_college'")) == 0)
 $this->db->query("CREATE TABLE pr_college(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL UNIQUE)");
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_level'")) == 0)
 $this->db->query("CREATE TABLE pr_level(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, level INT NOT NULL, name VARCHAR(20) NOT NULL)");
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_rates'")) == 0)
 $this->db->query("CREATE TABLE pr_rates(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, pid INT NOT NULL, ip VARCHAR(40) NOT NULL, category INT NOT NULL)");
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_users'")) == 0)
 $this->db->query("CREATE TABLE pr_users(uid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(45) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL, level INT NOT NULL )");
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_works'")) == 0)
 $this->db->query("CREATE TABLE pr_works(pid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, content TEXT, realname VARCHAR(20) NOT NULL, studentnum VARCHAR(20) NOT NULL, college INT NOT NULL, filename TEXT NOT NULL, category INT NOT NULL)");
 $query1 = $this->db->get_where('pr_level',array('level' => 1, 'name' => '普通用户'));
 $query2 = $this->db->get_where('pr_level',array('level' => 5, 'name' => '管理员'));
 $query3 = $this->db->get_where('pr_level',array('level' => 99, 'name' => '超级管理员'));
 if ($query1->num_rows() == 0)
 $this->db->query("INSERT INTO pr_level(level, name) VALUES (1, '普通用户')");
 if ($query2->num_rows() == 0)
 $this->db->query("INSERT INTO pr_level(level, name) VALUES (5, '管理员')");
 if ($query3->num_rows() == 0)
 $this->db->query("INSERT INTO pr_level(level, name) VALUES (99, '超级管理员')");
 $this->username = $this->input->post('username');
 $this->password = $this->input->post('password');
 $this->level = 99;
 $query4 = $this->db->get_where('pr_users',array('username' => $this->input->post('username')));
 if ($query4->num_rows() == 0) {
 $this->db->insert('pr_users', $this);
 return TRUE;
 } else {
 return FALSE;
 }
 }

其实这么写查询量很大效率又低,不过这有效的避免了上一次安装被打断之后重新安装遇到的麻烦,检测是否已经创建了某个表,是否已经有新用户了之类的。

 代码如下 复制代码
mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_category'"))

这句可以查询数据库中是否存在这个表。

执行完如果顺利的话,将install.php改个名字:

 代码如下 复制代码
 rename('application/controllers/install.php', 'application/controllers/install.lock');

在其他文件里加入检测install.php是否存在,如果存在的话就跳转到install.php,这样就做好了简单的安装流程了(必须放在model前,否则会提示没有数据库而不会跳转)。

 代码如下 复制代码
 if (file_exists('application/controllers/install.php'))
 redirect('install');

至于什么是否存在表之类的,因为CI会check而且优先级也高于我们自己写的错误提示,所以这里就不加了。

完整源码(MVC):
Controller:

 代码如下 复制代码

 <?php
class Install extends CI_Controller {
 function __construct() {
 parent::__construct();
 $this->load->helper('url');
 $this->load->helper('file');
 }
 function index() {
 $data['title'] = '安装向导';
 $this->load->helper('form');
 $this->load->library('form_validation');
 $this->form_validation->set_rules('hostname', '主机名', 'trim|required|xss_clean');
 $this->form_validation->set_rules('rootname', '数据库用户名', 'trim|required|xss_clean');
 $this->form_validation->set_rules('username', '用户名', 'trim|required|xss_clean');
 $this->form_validation->set_rules('password', '密码', 'trim|required|xss_clean|md5');
 $data['error'] = '';
 if ($this->form_validation->run() == FALSE) {
 $this->load->view('install', $data);
 } else {
 $config['hostname'] = $this->input->post('hostname');
 $config['username'] = $this->input->post('rootname');
 $config['password'] = $this->input->post('pass');
 $config['database'] = $this->input->post('book');
 $config['dbdriver'] = 'mysql';
 $config['dbprefix'] = '';
 $config['pconnect'] = TRUE;
 $config['db_debug'] = TRUE;
 $config['cache_on'] = FALSE;
 $config['cachedir'] = '';
 $config['char_set'] = 'utf8';
 $config['dbcollat'] = 'utf8_general_ci';
 $config['swap_pre'] = '';
 $config['autoinit'] = TRUE;
 $config['stricton'] = FALSE;
 if ($this->load->database($config, TRUE)) {
 $content = "<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');n";
 $content .= '$active_group'. "= 'default';n";
 $content .= '$active_record'." = TRUE;n";
 $content .= '$db'."['default']['hostname'] = '".$this->input->post('hostname')."';n";
 $content .= '$db'."['default']['username'] = '".$this->input->post('rootname')."';n";
 $content .= '$db'."['default']['password'] = '".$this->input->post('pass')."';n";
 $content .= '$db'."['default']['database'] = '".$this->input->post('book')."';n";
 $content .= '$db'."['default']['dbdriver'] = 'mysql';n";
 $content .= '$db'."['default']['dbprefix'] = '';n";
 $content .= '$db'."['default']['pconnect'] = TRUE;n";
 $content .= '$db'."['default']['db_debug'] = TRUE;n";
 $content .= '$db'."['default']['cache_on'] = FALSE;n";
 $content .= '$db'."['default']['cachedir'] = '';n";
 $content .= '$db'."['default']['char_set'] = 'utf8';n";
 $content .= '$db'."['default']['dbcollat'] = 'utf8_general_ci';n";
 $content .= '$db'."['default']['swap_pre'] = '';n";
 $content .= '$db'."['default']['autoinit'] = TRUE;n";
 $content .= '$db'."['default']['stricton'] = FALSE;";
 if (write_file('application/config/database.php', $content)) {
 $this->load->model('install_model');
 if ($this->install_model->install()) {
 rename('application/controllers/install.php', 'application/controllers/install.lock');
 $this->load->library('session');
 if (!empty($this->session->userdata['login'])) {
 $this->session->sess_destroy(); // destroy the session
 }
 redirect('poster_admin/login', 'refresh');
 } else {
 $data['error'] = '超级管理员用户名已存在';
 $this->load->view('install', $data);
 }
 } else {
 $data['error'] = '安装失败,无法写入文件';
 $this->load->view('install', $data);
 }
 }
 }
 }
}
?>
Model:

class Install_model extends CI_Model {
 function __construct() {
 parent::__construct();
 $this->load->database();
 $this->load->dbforge();
 }
 function install() {
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_category'")) == 0)
 $this->db->query("CREATE TABLE pr_category(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, category VARCHAR(100) NOT NULL UNIQUE, deadline INT NOT NULL)");
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_college'")) == 0)
 $this->db->query("CREATE TABLE pr_college(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL UNIQUE)");
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_level'")) == 0)
 $this->db->query("CREATE TABLE pr_level(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, level INT NOT NULL, name VARCHAR(20) NOT NULL)");
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_rates'")) == 0)
 $this->db->query("CREATE TABLE pr_rates(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, pid INT NOT NULL, ip VARCHAR(40) NOT NULL, category INT NOT NULL)");
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_users'")) == 0)
 $this->db->query("CREATE TABLE pr_users(uid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(45) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL, level INT NOT NULL )");
 if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_works'")) == 0)
 $this->db->query("CREATE TABLE pr_works(pid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, content TEXT, realname VARCHAR(20) NOT NULL, studentnum VARCHAR(20) NOT NULL, college INT NOT NULL, filename TEXT NOT NULL, category INT NOT NULL)");
 $query1 = $this->db->get_where('pr_level',array('level' => 1, 'name' => '普通用户'));
 $query2 = $this->db->get_where('pr_level',array('level' => 5, 'name' => '管理员'));
 $query3 = $this->db->get_where('pr_level',array('level' => 99, 'name' => '超级管理员'));
 if ($query1->num_rows() == 0)
 $this->db->query("INSERT INTO pr_level(level, name) VALUES (1, '普通用户')");
 if ($query2->num_rows() == 0)
 $this->db->query("INSERT INTO pr_level(level, name) VALUES (5, '管理员')");
 if ($query3->num_rows() == 0)
 $this->db->query("INSERT INTO pr_level(level, name) VALUES (99, '超级管理员')");
 $this->username = $this->input->post('username');
 $this->password = $this->input->post('password');
 $this->level = 99;
 $query4 = $this->db->get_where('pr_users',array('username' => $this->input->post('username')));
 if ($query4->num_rows() == 0) {
 $this->db->insert('pr_users', $this);
 return TRUE;
 } else {
 return FALSE;
 }
 }
}
View:

<!DOCTYPE html>
<html lang="Zh-CN">
<html>
<head>
 <meta charset="utf-8"/>
 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
 <link rel="stylesheet" href="<?php echo base_url() . 'css/bootstrap.css' ?>">
 <link rel="stylesheet" href="<?php echo base_url() . 'css/login.css' ?>">
 <link rel="icon" type="image/x-icon" href="<?php echo base_url() . 'favicon.ico' ?>"/>
 <script src="<?php echo base_url() . 'js/jquery-1.9.0.js' ?>"></script>
 <script src="<?php echo base_url() . 'js/bootstrap.js' ?>"></script>
 <title><?php echo $title; ?> - SMU Poster</title>
</head>
<body>
<div class="container">
 <div class="row">
 <div class="col-sm-4 col-sm-offset-4">
 <div <?php $err = validation_errors(); echo !(empty($error) && empty($err)) ? 'class="alert alert-danger text-center"' : '' ?>><?php echo validation_errors(); ?>
 <?php echo $error ?></div>
 <?php echo form_open('install', array('class'=>'form-horizontal','role'=>'form')); ?>
 <div class="col-sm-sm-4 col-sm-offset-4"><h2>安装向导</h2></div>
 <div class="form-group">
 <div class="col-sm-9 col-sm-offset-2">
 <div class="input-group">
 <span class="input-group-addon"><span class="glyphicon glyphicon-cloud"></span></span>
 <input type="text" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="一般为localhost" id="hostname" name="hostname" placeholder="主机名" value="localhost"/>
 </div>
 </div>
 </div>
 <div class="form-group">
 <div class="col-sm-9 col-sm-offset-2">
 <div class="input-group">
 <span class="input-group-addon"><span class="glyphicon glyphicon-book"></span></span>
 <input type="text" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="数据库名如poster,请自行创建" id="book" name="book" placeholder="数据库名"/>
 </div>
 </div>
 </div>
 <div class="form-group">
 <div class="col-sm-9 col-sm-offset-2">
 <div class="input-group">
 <span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span>
 <input type="text" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="连接数据库的账号" id="rootname" name="rootname" placeholder="数据库账号"/>
 </div>
 </div>
 </div>
 <div class="form-group">
 <div class="col-sm-9 col-sm-offset-2">
 <div class="input-group">
 <span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span>
 <input type="password" class="form-control" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="连接数据库的密码" id="pass" name="pass" placeholder="数据库密码"/>
 </div>
 </div>
 </div>
 <div class="form-group">
 <div class="col-sm-9 col-sm-offset-2">
 <div class="input-group">
 <span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span>
 <input type="text" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="注册一个后台超级管理员账号" class="form-control" id="username" name="username" placeholder="后台登录账号"/>
 </div>
 </div>
 </div>
 <div class="form-group">
 <div class="col-sm-9 col-sm-offset-2">
 <div class="input-group">
 <span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span>
 <input type="password" onMouseOver="$(this).tooltip('show')" data-toggle="tooltip" title="后台超级管理员密码" class="form-control" id="password" name="password" placeholder="后台登陆密码"/>
 </div>
 </div>
 </div>
 <div class="form-group">
 <div class="col-sm-offset-3 col-sm-9">
 <button type="submit" class="btn btn-default">开始安装</button>
 </div>
 </div>
 </form>
 </div>
 </div>
</div>
<div id="footer">
 <div class="container">
 <p class="text-center copyright text-muted">Designed By <a href="http://www.111cn.net/">微软技术俱乐部</a></p>
 </div>
</div>
</body>
</html>

需要安装imagick及其php扩展。一共有二个函数,都是从网上摘下来的,还没测试,这个方案应该可行,可以简单的仿照在线文档功能,有机会在项目中实践一下

第一种

 代码如下 复制代码
/**
* PDF2PNG  
* @param $pdf  待处理的PDF文件
* @param $path 待保存的图片路径
* @param $page 待导出的页面 -1为全部 0为第一页 1为第二页
* @return      保存好的图片路径和文件名
*/
 function pdf2png($pdf,$path,$page=0)

   if(!is_dir($path))
   {
       mkdir($path,true);
   }
   if(!extension_loaded('imagick'))
   { 
     echo '没有找到imagick!' ;
     return false;
   } 
   if(!file_exists($pdf))
   { 
      echo '没有找到pdf' ;
       return false; 
   }   www.111cn.net
   $im = new Imagick(); 
   $im->setResolution(120,120);   //设置图像分辨率
   $im->setCompressionQuality(80); //压缩比
   $im->readImage($pdf."[".$page."]"); //设置读取pdf的第一页
   //$im->thumbnailImage(200, 100, true); // 改变图像的大小
   $im->scaleImage(200,100,true); //缩放大小图像
   $filename = $path."/". time().'.png';
   if($im->writeImage($filename) == true)
   { 
      $Return  = $filename; 
   } 
   return $Return; 

$s = pdf2png('file/1371273225-ceshi_ppt.pdf','images');
echo '<div align="center"><img src="'.$s.'"></div>';

第二种

 代码如下 复制代码
function pdf2png($PDF,$Path){
   if(!extension_loaded('imagick')){
       return false;
   }
   if(!file_exists($PDF)){
       return false;
   }
   $IM = new imagick();
   $IM->setResolution(120,120);
   $IM->setCompressionQuality(100);
   $IM->readImage($PDF);
   foreach ($IM as $Key => $Var){
       $Var->setImageFormat('png');
       $Filename = $Path.'/'.md5($Key.time()).'.png';
       if($Var->writeImage($Filename) == true){
           $Return[] = $Filename;
       } www.111cn.net
   }
   return $Return;
}

创建一个jpg缩略图并显示出来
 

 代码如下 复制代码
<?php
header('Content-type: image/jpeg');
$image = new Imagick('image.jpg');
// If 0 is provided as a width or height parameter,// aspect ratio is maintained
$image->thumbnailImage(100, 0);
echo $image;
?>

缩略GIF动画图片
 

 代码如下 复制代码
<?php
/* Create a new imagick object and read in GIF */
$im = new Imagick("example.gif");
/* Resize all frames */
foreach ($im as $frame) {
/* 50x50 frames */
$frame->thumbnailImage(50, 50);
/* Set the virtual canvas to correct size */
$frame->setImagePage(50, 50, 0, 0);
}/* Notice writeImages instead of writeImage */
$im->writeImages("example_small.gif", true);
?>
json_encode处理中文会有几种情况一种是null空,一种是u80e5这种符号,还有一种就是正常的中文了,下面一聚教程小编就来给你把这些问题一种整理一篇。

json_encode这个函数作用是起到不同语言之间数据传递的作用,尤其是php对js之间数据交换十分方便。

但是json_encode这个函数在使用的时候需要注意几点:

1 所传输的数据必须是UTF8格式的

2 需要对中文做一些URLENCODE处理


json_encode中文为null解决


原因分析:使用json_encode函数应应使用utf-8编码,我的页面用的是gbk.
解决:在json_encode函数前使用iconv('gbk','utf8')函数。

 代码如下 复制代码

function gbk2utf8($data){
if(is_array($data)){
return array_map('gbk2utf8', $data);
}
return iconv('gbk','utf-8',$data);
}

这样显示出来的会是如{"item1":1,"item2":"u4e2du6587"} 格式了,虽然空解决了,但是没显示汉字呀。

我们再来分析一下

例如:'胥'经过json_encode处理后变为'u80e5',最终的json中中文部分被替换为unicode编码。我们要解决的就是将对象转换为json并保证对象内部的中文在json中仍然是以正常的中文出现,现在看来只使用json_encode是不能达到目的的。www.111cn.net
  我的解决方法:先将类中的中文字段进行url编码(urlencode),然后再对对象进行json编码(jsonencode),最后url解码(urldecode)json,即最终的json,里面的中文依旧是那个中文!

 代码如下 复制代码

<?php
    $testJSON=array('name'=>'中文字符串','value'=>'test');
    //echo json_encode($testJSON);
    foreach ( $testJSON as $key => $value ) {
  $testJSON[$key] = urlencode ( $value );
    }
    echo urldecode ( json_encode ( $testJSON ) );
?>

查看输出结果为:

{“name”:”中文字符串”,”value”:”test”}

到此,成功地输出了中文字符。随意使用json_encode吧。这样子在PHP后台输出的JSON字符串在前台javascript中Ajax接收后eval出来也不会出现中文乱码,因为js在处理JSON格式数据是也是以UTF8的形式进行的,与PHP类似,故接收PHP页面的JSON字符串不会出现问题。


下面是对json_encode这个函数做一些完善

 代码如下 复制代码

<?php
/**************************************************************
*
* 使用特定function对数组中所有元素做处理
* @param string &$array 要处理的字符串
* @param string $function 要执行的函数
* @return boolean $apply_to_keys_also 是否也应用到key上
* @access public
*
*************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
static $recursive_counter = 0;
if (++$recursive_counter > 1000) {
die('possible deep recursion attack');
}
foreach ($array as $key => $value) {
if (is_array($value)) {
arrayRecursive($array[$key], $function, $apply_to_keys_also);
} else {
$array[$key] = $function($value);
}
 
if ($apply_to_keys_also && is_string($key)) {
$new_key = $function($key);
if ($new_key != $key) {
$array[$new_key] = $array[$key];
unset($array[$key]);
}
}
}
$recursive_counter--;
}
 
/**************************************************************
* www.111Cn.net
* 将数组转换为JSON字符串(兼容中文)
* @param array $array 要转换的数组
* @return string 转换得到的json字符串
* @access public
*
*************************************************************/
function JSON($array) {
arrayRecursive($array, 'urlencode', true);
$json = json_encode($array);
return urldecode($json);
}
 
$array = array
(
'Name'=>'希亚',
'Age'=>20
);
 
echo JSON($array);
?>

最近在模拟登录的时候愈发的出现登录失败的情况,原因是:微信公众平台登录如果时不时的会对一些异常帐号要求输入验证码才可以登录

这个时候平台首页的登录逻辑就会经常出现无法登录的状态,前几天写了一个抓取验证码要求用户输入,这个么有做多少代码的调整,主要是

让前端写了一写js直接调用微信公众平台的验证码连接了,发现不行,两个方面:

1、imgcode这个表单名打错了

2、在抓包的时候突然发现获取验证码的连接有设置cookie的

发现问题后这些都不是什么大事了,码码代码松松解决:


public function getImgCode($username){
 $str = $this -> getcurl()-> get("https://mp.weixin.qq.com/cgi-bin/verifycode?username=".$username."&r=".time())->execute();
 header('Content-Type:image/jpeg');
 echo $str;
    }

先用curl来请求验证码,顺便将cookie保存下来,当然这里我对curl进行了简单的封装,然后直接将输出抓取到内容,输出header头

PS:这里遇到一个问题,其实也不算什么问题,可能会经常注意不到,在测试的时候发现有一个warning错误,提示头已经发送。我就很郁闷了

直接在代码中输出呢,为什么会出现这个呢。文件也是utf-8无bom头的格式,往下一拉才发现当前这个类库中有写 ?> 这个东西,后边正好有一个空行。

其实把重点不在这里,因为就算这个文件的末尾有空行也不会提示头已经发送啊。直接分析到curl类文件中,OK,果然这个文件中又写了 ?> shit!!!

原文来自:http://www.mapenggang.com/

 

[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • Go语言压缩和解压缩tar.gz文件的方法

    这篇文章主要介绍了Go语言压缩和解压缩tar.gz文件的方法,实例分析了使用Go语言压缩文件与解压文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-03
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • AI源文件转photoshop图像变模糊问题解决教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
  • ant design中upload组件上传大文件,显示进度条进度的实例

    这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29
  • C#使用StreamWriter写入文件的方法

    这篇文章主要介绍了C#使用StreamWriter写入文件的方法,涉及C#中StreamWriter类操作文件的相关技巧,需要的朋友可以参考下...2020-06-25
  • php实现文件下载实例分享

    举一个案例:复制代码 代码如下:<?phpclass Downfile { function downserver($file_name){$file_path = "./img/".$file_name;//转码,文件名转为gb2312解决中文乱码$file_name = iconv("utf-8","gb2312",$file_name...2014-06-07
  • C#路径,文件,目录及IO常见操作汇总

    这篇文章主要介绍了C#路径,文件,目录及IO常见操作,较为详细的分析并汇总了C#关于路径,文件,目录及IO常见操作,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 查找php配置文件php.ini所在路径的二种方法

    通常php.ini的位置在:复制代码 代码如下:/etc目录下或/usr/local/lib目录下。如果你还是找不到php.ini或者找到了php.ini修改后不生效(其实是没找对),请使用如下办法:1.新建php文件,写入如下代码复制代码 代码如下:<?phpe...2014-05-31