PHP目录/文件拷贝/复制自定义函数分享
文件夹文件拷贝/复制函数如下
/** * 文件夹文件拷贝 * * @param string $src 来源文件夹 * @param string $dst 目的地文件夹 * @return bool */ function dir_copy($src = '', $dst = '') { if (empty($src) || empty($dst)) { return false; } $dir = opendir($src); dir_mkdir($dst); while (false !== ($file = readdir($dir))) { if (($file != '.') && ($file != '..')) { if (is_dir($src . '/' . $file)) { dir_copy($src . '/' . $file, $dst . '/' . $file); } else { copy($src . '/' . $file, $dst . '/' . $file); } } } closedir($dir); return true; } /** * 创建文件夹 * * @param string $path 文件夹路径 * @param int $mode 访问权限 * @param bool $recursive 是否递归创建 * @return bool */ function dir_mkdir($path = '', $mode = 0777, $recursive = true) { clearstatcache(); if (!is_dir($path)) { mkdir($path, $mode, $recursive); return chmod($path, $mode); } return true; }
PHP复制文件夹及下面所有文件,参考如下:
function xCopy($source, $destination, $child){ //用法: // xCopy("feiy","feiy2",1):拷贝feiy下的文件到 feiy2,包括子目录 // xCopy("feiy","feiy2",0):拷贝feiy下的文件到 feiy2,不包括子目录 //参数说明: // $source:源目录名 // $destination:目的目录名 // $child:复制时,是不是包含的子目录 if(!is_dir($source)){ echo("Error:the $source is not a direction!"); return 0; } if(!is_dir($destination)){ mkdir($destination,0777); } $handle=dir($source); while($entry=$handle->read()) { if(($entry!=".")&&($entry!="..")){ if(is_dir($source."/".$entry)){ if($child) xCopy($source."/".$entry,$destination."/".$entry,$child); } else{ copy($source."/".$entry,$destination."/".$entry); } } } return 1; } ?>
作为php菜鸟,在公司捣鼓的一个基于thinkphp框架项目上要是用七牛(原来有用过C#版本的sdk)。现在在官方找到php的官方sdk,最后发现原来Thinkphp已经支持驱动类型是qiniu的文件上传了。
现在将配置说明一下。
利用七牛云私有空间存储文件
注册七牛云,创建空间,将空间设为私有
需要记下的东西:
AK,SK,bucket
在config.php添加
//七牛上传文件设置
'PICTURE_UPLOAD_DRIVER'=>'Qiniu',
//本地上传文件驱动配置
'UPLOAD_LOCAL_CONFIG'=>array(),
'UPLOAD_QINIU_CONFIG'=>array(
'accessKey'=>'l3N4q0XCqm0rssaaMTHryZYG-LnKMH',
'secrectKey'=>'7qPVaeRasasan2TjALqQAjF0h6jOt0D1jF',
'bucket'=>'yaasasnbao',
'domain'=>'7xasssa.com2.z0.glb.qiniucdn.com',
'timeout'=>3600,
),
3、添加一个上传类Model
<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: huajie <banhuajie@163.com>
// +----------------------------------------------------------------------
namespace Admin\Model;
use Think\Model;
use Think\Upload;
/**
* 图片模型
* 负责图片的上传
*/
class PictureModel extends Model{
/**
* 自动完成
* @var array
*/
protected $_auto = array(
array('status', 1, self::MODEL_INSERT),
array('create_time', NOW_TIME, self::MODEL_INSERT),
);
/**
* 文件上传
* @param array $files 要上传的文件列表(通常是$_FILES数组)
* @param array $setting 文件上传配置
* @param string $driver 上传驱动名称
* @param array $config 上传驱动配置
* @return array 文件上传成功后的信息
*/
public function upload($files, $setting, $driver = 'Local', $config = null){
/* 上传文件 */
$Upload = new Upload($setting, $driver, $config);
$info = $Upload->upload($files);
if($info){ //文件上传成功,记录文件信息
return $info; //文件上传成功
} else {
$this->error = $Upload->getError();
return false;
}
}
/**
* 下载指定文件
* @param number $root 文件存储根目录
* @param integer $id 文件ID
* @param string $args 回调函数参数
* @return boolean false-下载失败,否则输出下载文件
*/
public function download($root, $id, $callback = null, $args = null){
/* 获取下载文件信息 */
$file = $this->find($id);
if(!$file){
$this->error = '不存在该文件!';
return false;
}
/* 下载文件 */
switch ($file['location']) {
case 0: //下载本地文件
$file['rootpath'] = $root;
return $this->downLocalFile($file, $callback, $args);
case 1: //TODO: 下载远程FTP文件
break;
default:
$this->error = '不支持的文件存储类型!';
return false;
}
}
/**
* 检测当前上传的文件是否已经存在
* @param array $file 文件上传数组
* @return boolean 文件信息, false - 不存在该文件
*/
public function isFile($file){
if(empty($file['md5'])){
throw new \Exception('缺少参数:md5');
}
/* 查找文件 */
$map = array('md5' => $file['md5'],'sha1'=>$file['sha1'],);
return $this->field(true)->where($map)->find();
}
/**
* 下载本地文件
* @param array $file 文件信息数组
* @param callable $callback 下载回调函数,一般用于增加下载次数
* @param string $args 回调函数参数
* @return boolean 下载失败返回false
*/
private function downLocalFile($file, $callback = null, $args = null){
if(is_file($file['rootpath'].$file['savepath'].$file['savename'])){
/* 调用回调函数新增下载数 */
is_callable($callback) && call_user_func($callback, $args);
/* 执行下载 */ //TODO: 大文件断点续传
header("Content-Description: File Transfer");
header('Content-type: ' . $file['type']);
header('Content-Length:' . $file['size']);
if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { //for IE
header('Content-Disposition: attachment; filename="' . rawurlencode($file['name']) . '"');
} else {
header('Content-Disposition: attachment; filename="' . $file['name'] . '"');
}
readfile($file['rootpath'].$file['savepath'].$file['savename']);
exit;
} else {
$this->error = '文件已被删除!';
return false;
}
}
/**
* 清除数据库存在但本地不存在的数据
* @param $data
*/
public function removeTrash($data){
//$this->where(array('id'=>$data['id'],))->delete();
}
}
4、修改调用上传类的代码
public function ImgUpload()
{
//$this->error("没有文件!");
//TODO: 用户登录检测
/* 调用文件上传组件上传文件 */
$Picture = D('Picture');
$pic_driver = C('PICTURE_UPLOAD_DRIVER');
$info = $Picture->upload(
$_FILES,
C('PICTURE_UPLOAD'),
C('PICTURE_UPLOAD_DRIVER'),
C("UPLOAD_{$pic_driver}_CONFIG")
); //TODO:上传到远程服务器
/* 记录图片信息 */
if($info){
/* 返回JSON数据 */
echo json_encode($info);
} else {
echo json_encode($info);
}
}
5、在客户端使用ajaxfileupload调用php方法
//上传图片
$(document).on('change','#upfile',function(){
$.ajaxFileUpload({
url:'{:U("Company/ImgUpload")}',
secureuri:false,
fileElementId:'upfile',
dataType: 'json',
type:'post',
data: { fileElementId: 'upfile'},
success: function (data) {
$('#showimg').attr('src',data.upfile.url);
$('#imageurl').val(data.upfile.url);
}
})
})
这里最好使用json的数据类型进行传输
我将使用Windows系统的设备定为PC,毕竟博客面向中国用户,大部分家用设备还是用的Windows系统
原理是判断浏览器提交的USER AGENT
代码如下 | 复制代码 |
<?php //分析数据 //输出数据 |
如果你只判断是否为iphone设备可以如下来进行操作
代码如下 | 复制代码 |
function get_device_type(){ |
默认的情况下,WordPress 的插件是按照插件的字母顺序加载的,比如 a/a.php 是比 b/b.php 先加载的,那么我们需要更改插件的加载顺序如何操作呢,由于激活的插件是存在 active_plugins 的 option 里面,我们只需要激活或者停用插件的时候,系统更新 active_plugins 这个 option 值之前 hook 它就可以。
比如下面的代码,我们可以把微信机器人插件设置为最后加载:
add_filter('pre_update_option_active_plugins', 'weixin_robot_set_plugin_load_late');
function weixin_robot_set_plugin_load_late($active_plugins){
$weixin_plugin = plugin_basename(WEIXIN_ROBOT_PLUGIN_FILE);
if(false !== ($plugin_key = array_search($weixin_plugin, $active_plugins))){
unset($active_plugins[$plugin_key]);
$active_plugins[] = $weixin_plugin;
}
return $active_plugins;
}
更多:
一般来说如果插件里面都全是函数,而没有立刻执行的代码,插件的加载顺序是没有关系,如果需要在插件里面有立刻执行的代码,最好放到 plugins_loaded action 里面执行,这样 action 的意思是所有的插件加载完成之后执行的动作。
php中$_POST,$HTTP_RAW_POST_DATA 和 php://input 的区别是什么呢,我相信许多的朋友都不了解,特别是后者几乎很少使用的到了,但是后面两者对安全性来讲风险更大哦,下面一起来了解一下它们三的区别吧.HTML <form< 标签的 enctype 属性
首先来了解什么是 <form< 标签的 enctype 属性,enctype 属性规定了在发送到服务器之前应该如何对表单数据进行编码,有三种类型:
属性值 描述
application/x-www-form-urlencoded 默认模式,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)
multipart/form-data 不对字符编码,在使用包含文件上传控件的表单时,必须使用该值。
text/plain 空格转换为 “+” 加号,但不对特殊字符编码。
当在网页提交了一个表单之后,可以使用三种 PHP 方式来获取 Post 数据:$_POST,$HTTP_RAW_POST_DATA,and php://input,有什么区别呢?
$_POST
$_POST 是获取表单 POST 过来数据(body部分)的最常用方法,上传的文件信息使用 $_FILES 获取。
$HTTP_RAW_POST_DATA
当浏览器从表单发送 POST 请求的时候,默认的 media type 是 “application/x-www-form-urlencoded”,意思就是字段名和值都编码了,每个 key-value 对使用 ‘&’ 字符分隔开,key 和 value 使用 ‘=’ 分开,并且 key 和 value 中的空格都会被替换成 + ,其他特殊字符都会被使用 urlencode 方式进行编码。
比如下面的 key-value 对:
name: Jonathan Doe
age: 23
formula: a + b == 13%!
会被编码下面的原始数据:
name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21
PHP 会解析这些原始的 POST 数据,并且格式化成数组,填充到 $_POST 中:
Array
(
[name] => Jonathan Doe
[age] => 23
[formula] => a + b == 13%!
)
$HTTP_RAW_POST_DATA 是 PHP 的一个预定义的变量,用来获取原始的 POST 数据,比如上面的情况下,$HTTP_RAW_POST_DATA 的值就是:
name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21
但是 $HTTP_RAW_POST_DATA 需要在 php.ini 中设置开启:
always_populate_raw_post_data = On
还有一点,$HTTP_RAW_POST_DATA 不支持 enctype=”multipart/form-data” 方式传递的数据,这种情况下,我们要用 $_POST 获取字段的内容,$_FILES 来获取上传的文件信息。
php://input
由于 $HTTP_RAW_POST_DATA 取决于 pho.ini 设置,有没有更好的方法呢?
我们可以使用 php://input 来获取原始的 POST 数据,并且 php://input 比 $HTTP_RAW_POST_DATA 更少消耗内存,当然 php://input 和 $HTTP_RAW_POST_DATA 一样,它也不支持 enctype=”multipart/form-data” 方式传递的数据。
由于 php://input 只是数据流,我们可以使用 file_get_contents() 函数去获取它的内容:
$post_data = file_get_contents('php://input');
print_r($post_data);
获取到的内容和 $HTTP_RAW_POST_DATA 是一样的。
原始的 POST 数据有什么用?
那么原始的 POST 数据有什么用?因为很多时候,接收到不是网页 POST 过来的数据,而是可能通过其他方式 POST 过来的 “text/xml” 格式的数据,这些内容无法解析成 $_POST 数组,这个时候我们就需要原始的 POST 数据进行处理。
相关文章
- eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
- 在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要给大家介绍了关于C#创建自定义控件及添加自定义属性和事件使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
Android开发中findViewById()函数用法与简化
findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
- 为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07- Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- 下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
- 自定义一个jquery模态窗口插件,将它集成到现有平台框架中时,它只能在mainFrame窗口中显示,无法在顶层窗口显示. 解决这个问题的办法: 通过以下代码就可能实现在顶层窗口弹窗 复制代码 代码如下: $(window.top.documen...2014-05-31
- 这篇文章主要介绍了自定义feignClient的常见坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-20
- PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31