PHP文件上传进度条基于Session与Javascript实现
下面我们就详细介绍一下 PHP 5.4 的这个 session.upload_progress 新特性。
原理介绍
当浏览器向服务器端上传一个文件时,PHP将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中。然后,随着上传的进行,周期性的更新session中的信息。这样,浏览器端就可以使用Ajax周期性的请求一个服务器端脚本,由该脚本返回session中的进度信息;浏览器端的Javascript即可根据这些信息显示/更新进度条了。
那么,文件上传信息具体是如何存储的?我们要如何访问它呢?下面我们来详细说明。
PHP 5.4 中引入了一些配置项(在php.ini中进行设置)
session.upload_progress.enabled = "1"
session.upload_progress.cleanup = "1"
session.upload_progress.prefix = "upload_progress_"
session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
session.upload_progress.freq = "1%"
session.upload_progress.min_freq = "1"
其中enabled控制upload_progress功能的开启与否,默认开启;cleanup 则设置当文件上传的请求提交完成后,是否清除session的相关信息,默认开启。
prefix 和 name 两项用来设置进度信息在session中存储的变量名/键名。关于这两项的详细使用见下文。
freq 和 min_freq 两项用来设置服务器端对进度信息的更新频率。合理的设置这两项可以减轻服务器的负担。
在上传文件的表单中,需要为该次上传设置一个标识符,并在接下来的过程中使用该标识符来引用进度信息。具体的,在上传表单中需要有一个隐藏的input,它的name属性为php.ini中 session.upload_progress.name 的值;它的值为一个由你自己定义的标识符。如下:
<input type="hidden"
name="<?php echo ini_get('session.upload_progress.name'); ?>"
value="test" />
接到文件上传的表单后,PHP会在$_SESSION变量中新建键,键名是一个将session.upload_progress.prefix的值与上面你自定义的标识符连接后得到的字符串,可以这样得到:
$name = ini_get('session.upload_progress.name');
$key = ini_get('session.upload_progress.prefix') . $_POST[$name];
$_SESSION[$key]; // 这里就是此次文件上传的进度信息了
$_SESSION[$key]这个变量的结构是这样的:
$_SESSION["upload_progress_test"] = array(
"start_time" => 1234567890, // 开始时间
"content_length" => 57343257, // POST请求的总数据长度
"bytes_processed" => 453489, // 已收到的数据长度
"done" => false, // 请求是否完成 true表示完成,false未完成
// 单个文件的信息
"files" => array(
0 => array( ... ),
// 同一请求中可包含多个文件
1 => array( ... ),
)
);这样,我们就可以使用其中的 content_length 和 bytes_processed 两项来得到进度百分比。
程序示例
原理介绍完了,下面我们来完整的实现一个基于PHP和Javascript的文件上传进度条。
本示例的代码仓库: Github: pureweber/samples/php-upload-progress
上传表单
首先,来编写我们的上传表单页面 index.php,代码如下:
<form id="upload-form"
action="upload.php" method="POST" enctype="multipart/form-data"
style="margin:15px 0" target="hidden_iframe">
<input type="hidden" name="" value="test" />
<p><input type="file" name="file1" /></p>
<p><input type="submit" value="Upload" /></p>
</form>
<iframe id="hidden_iframe" name="hidden_iframe" src="about:blank" style="display:none;"></iframe>
<div id="progress" class="progress" style="margin-bottom:15px;display:none;">
<div class="bar" style="width:0%;"></div>
<div class="label">0%</div>
</div>注意表单中的session.upload_progress.name隐藏项,值设置为了test。表单中仅有一个文件上传input,如果需要,你可以添加多个。
这里需要特别注意一下表单的target属性,这里设置指向了一个当前页面中的iframe。这一点很关键,通过设置target属性,让表单提交后的页面显示在iframe中,从而避免当前的页面跳转。因为我们还得在当前页面显示进度条呢。
#progress 这个div是用来显示进度条的。
注意 别忘了在index.php的最开始加上session_start()。
处理上传的文件
表单的action指向upload.php,我们在upload.php中处理上传的文件,将它转存到当前目录。这里与通常情况下的上传处理没有区别。
if(is_uploaded_file($_FILES['file1']['tmp_name'])){
move_uploaded_file($_FILES['file1']['tmp_name'], "./{$_FILES['file1']['name']}");
}
?>Ajax获取进度信息
这一步是关键,我们需要建立一个 progress.php 文件,用来读取session中的进度信息; 然后我们在 index.php 中增加Javascript代码,向 progress.php 发起Ajax请求,然后根据获得的进度信息更新进度条。
progress.php 的代码如下:
session_start();
$i = ini_get('session.upload_progress.name');
$key = ini_get("session.upload_progress.prefix") . $_GET[$i];
if (!empty($_SESSION[$key])) {
$current = $_SESSION[$key]["bytes_processed"];
$total = $_SESSION[$key]["content_length"];
echo $current < $total ? ceil($current / $total * 100) : 100;
}else{
echo 100;
}
?>在这里我们获得$_SESSION变量中的进度信息,然后输出一个进度百分比。
在 index.php 中,我们将如下代码添加到页面底部 (为简便,这里使用jQuery):
function fetch_progress(){
$.get('progress.php',{ '' : 'test'}, function(data){
var progress = parseInt(data);
$('#progress .label').html(progress + '%');
$('#progress .bar').css('width', progress + '%');
if(progress < 100){
setTimeout('fetch_progress()', 100);
}else{
$('#progress .label').html('完成!');
}
}, 'html');
}
$('#upload-form').submit(function(){
$('#progress').show();
setTimeout('fetch_progress()', 100);
});
当#upload-form被提交时,我们把进度条显示出来,然后反复调用 fetch_progress() 获得进度信息,并更新进度条,直到文件上传完毕,显示'完成!'。
Done!
完整代码见: Github: pureweber/samples/php-upload-progress
注意事项
input标签的位置
name为session.upload_progress.name的input标签一定要放在文件input <input type="file" /> 的前面。
取消上传
通过设置 $_SESSION[$key]['cancel_upload'] = true 可取消当次上传。但仅能取消正在上传的文件和尚未开始的文件。已经上传成功的文件不会被删除。
setTimeout vs. setInterval
应该通过 setTimeout() 来调用 fetch_progress(),这样可以确保一次请求返回之后才开始下一次请求。如果使用 setInterval() 则不能保证这一点,有可能导致进度条出现'不进反退'。
我们以前常用mb_detect_encoding()此函数检测字符编码
代码如下 | 复制代码 |
//判断字符串是什么编码 if ($tag === mb_convert_encoding(mb_convert_encoding($tag, "GB2312", "UTF-8"), "UTF-8", "GB2312")) { } else {//如果是gb2312 的就转换为utf8的 $tag = mb_convert_encoding($tag, 'UTF-8', 'GB2312'); } |
$keytitle = “%D0%BE%C6%AC”;时。检测结果却是UTF-8.这个bug其实不算是bug,写程序时也不应当过于依赖mb_detect_encoding,当字符串较短时,检测结果产生偏差的可能性很大。
怎么解决呢,我的办法是:
代码如下 | 复制代码 |
$encode = mb_detect_encoding($keytitle, array('ASCII','GB2312′,'GBK','UTF-8'); |
个参数分别是:被检测的输入变量、编码方式的检测顺序(一旦为真,后面自动忽略)、strict模式
对编码检测的顺序进行调整,将最大可能性放在前面,这样减少被错误转换的机会。
上面办法还是解决不了,下面又找到了一个解决方法。
例1
代码如下 | 复制代码 |
// Returns true if $string is valid UTF-8 and false otherwise. |
这几天工作有大量用curl,curl就是模拟浏览器来传输数据,他支持很多的协议HTPP,HTTPS,FTP….等等很多协议,在做采集和模拟用户来执行一些操作的时候非常有用的。
使用CURL主要是四个步骤:
1、初始化URL
2、设置请求的一些参数(COOKIE,HEAD…)
3、执行请求
4、关闭资源
先说一个简单的采集,一般在获取一个网页的内容的时候我们最方便就是使用file_get_contents()函数来获取,现在我们通过CURL来抓取一个网页的内容
代码如下 | 复制代码 |
$ch = curl_init();//初始化一个资源 |
注:重点在于curl_setopt()这个函数的第二个参数(下面会有一些常用的资料)
这样我们就可以得到这个网页的内容,如果只有CURL来做些这就大材小用了,CURL其实可以用来做更加神奇的东西。
最近刚到一家创业型的新公司(尼玛,选择这个公司真的是比较纠结,因为手里有好几个offer,但是这边给的工资待遇很低,因为创业型公司吗。我也不知道为什么会选择这家公司,反正是为了选择这家公司,朋友都很不解,其实我也不知道为什么会选择这家,其他公司的工资大概是这家公司的两倍,希望这次没有选错,不然.想死的心都会有,说了这么多废话),做的是现在比较火的微信公众平台的开发,因为微信现在开放的接口特别的少,所以通过接口得到的东西特别的少(尼玛,小马哥你什么时候多放的借口啊!),但是官方提供的操作平台有很多接口中没有数据所以,我们需要去自己去找一些数据了,好吧,主角上场CURL。
首先公众平台是要登录才能访问,那我就先登录吧(废话),首先需要抓包分析一下正常提交数据,这里我就不截图了(博客在bae平台上,编辑器还没有时间去理他,不太好使),通过抓包分析得出,微信的公众平台使用的是ajax登录,且密码在提交之前已经进行了md5加密(好像正规应该叫md5散列把,而且标准的MD5散列应该是128位的,不过为了方便存储和传输就现在最多的就是32和16位了,刚了解,惭愧),还有很重要一点就是,微信公众平台采用的是https协议进行登录的。最爽的一点就是不用验证码,sogay。不然老费劲了,分析到这就可以了。Come on !!!!
代码如下 | 复制代码 |
//这里的头信息都是必须要设置的,这些你都可以在刚才抓包的时候获取到
$ch = curl_init(); curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);//设置cookie的保存目录,这里很重要,你懂的(cookie你都不存,你以为你是麻花腾啊!) //获取到token的值 $loginData = json_decode($loginData,true); $token = explode("=",$loginData['ErrMsg']); $token = array_pop($token); echo "登录微信系统成功<br />";
|
上边就是登录微信公众平台的代码了,经测试十分好用+_+。
这几天微信公众平台接触的比较多,这个只是万里长征的第一步,后边我会分享一下如何将微信的fakeid 和 openid对应起来,实现自己可以自己的平台上显示用户的完整信息(据我了解,网上现在对于如何fakeid 和 openid对应来没有很好的解决方案,通过好几天的奋斗现在已经可以对应起来的,比较麻烦,且已有的用户是无法对起来的(其实这个理论上是可以的,但是没有做出来不乱说,其实是没有时间去做这个,有机会可以尝试,不过实现需要已有系统的支持,也就是你现在的系统必须记录了和用回的聊天记录(我说什么了?我什么都没有说!)))。
体育老师啊,你说你不好好带你的体育课,没有跑来教我们语文,这几天接触不少能写的东西太多了,所以想到那就写到那了,有点乱,几天主要用的是CURL,所以今天说点CURL的实例,正好就把手头的登录微信公众平台的东西写上来了,CURL到此结束,后边我可能会写更多关于微信公众平台的东西。
附:
选项 |
可选value值 |
备注 |
CURLOPT_AUTOREFERER |
当根据Location:重定向时,自动设置header中的Referer:信息。 |
|
CURLOPT_BINARYTRANSFER |
在启用CURLOPT_RETURNTRANSFER的时候,返回原生的(Raw)输出。 |
|
CURLOPT_COOKIESESSION |
启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下cURL会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。 |
|
CURLOPT_CRLF |
启用时将Unix的换行符转换成回车换行符。 |
|
CURLOPT_DNS_USE_GLOBAL_CACHE |
启用时会启用一个全局的DNS缓存,此项为线程安全的,并且默认启用。 |
|
CURLOPT_FAILONERROR |
显示HTTP状态码,默认行为是忽略编号小于等于400的HTTP信息。 |
|
CURLOPT_FILETIME |
启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的CURLINFO_FILETIME选项返回。 curl_getinfo(). |
|
CURLOPT_FOLLOWLOCATION |
启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。 |
|
CURLOPT_FORBID_REUSE |
在完成交互以后强迫断开连接,不能重用。 |
|
CURLOPT_FRESH_CONNECT |
强制获取一个新的连接,替代缓存中的连接。 |
|
CURLOPT_FTP_USE_EPRT |
启用时当FTP下载时,使用EPRT (或 LPRT)命令。设置为FALSE时禁用EPRT和LPRT,使用PORT命令 only. |
|
CURLOPT_FTP_USE_EPSV |
启用时,在FTP传输过程中回复到PASV模式前首先尝试EPSV命令。设置为FALSE时禁用EPSV命令。 |
|
CURLOPT_FTPAPPEND |
启用时追加写入文件而不是覆盖它。 |
|
CURLOPT_FTPASCII |
CURLOPT_TRANSFERTEXT的别名。 |
|
CURLOPT_FTPLISTONLY |
启用时只列出FTP目录的名字。 |
|
CURLOPT_HEADER |
启用时会将头文件的信息作为数据流输出。 |
|
CURLINFO_HEADER_OUT |
启用时追踪句柄的请求字符串。 |
从 PHP 5.1.3 开始可用。CURLINFO_前缀是故意的(intentional)。 |
CURLOPT_HTTPGET |
启用时会设置HTTP的method为GET,因为GET是默认是,所以只在被修改的情况下使用。 |
|
CURLOPT_HTTPPROXYTUNNEL |
启用时会通过HTTP代理来传输。 |
|
CURLOPT_MUTE |
启用时将cURL函数中所有修改过的参数恢复默认值。 |
|
CURLOPT_NETRC |
在连接建立以后,访问~/.netrc文件获取用户名和密码信息连接远程站点。 |
|
CURLOPT_NOBODY |
启用时将不对HTML中的BODY部分进行输出。 |
|
CURLOPT_NOPROGRESS |
启用时关闭curl传输的进度条,此项的默认设置为启用。 Note:PHP自动地设置这个选项为TRUE,这个选项仅仅应当在以调试为目的时被改变。
|
|
CURLOPT_NOSIGNAL |
启用时忽略所有的curl传递给php进行的信号。在SAPI多线程传输时此项被默认启用。 |
cURL 7.10时被加入。 |
CURLOPT_POST |
启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。 |
|
CURLOPT_PUT |
启用时允许HTTP发送文件,必须同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE。 |
|
CURLOPT_RETURNTRANSFER |
将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。 |
|
CURLOPT_SSL_VERIFYPEER |
禁用后cURL将终止从服务端进行验证。使用CURLOPT_CAINFO选项设置证书使用CURLOPT_CAPATH选项设置证书目录 如果CURLOPT_SSL_VERIFYPEER(默认值为2)被启用,CURLOPT_SSL_VERIFYHOST需要被设置成TRUE否则设置为FALSE。 |
自cURL 7.10开始默认为TRUE。从cURL 7.10开始默认绑定安装。 |
CURLOPT_TRANSFERTEXT |
启用后对FTP传输使用ASCII模式。对于LDAP,它检索纯文本信息而非HTML。在Windows系统上,系统不会把STDOUT设置成binary模式。 |
|
CURLOPT_UNRESTRICTED_AUTH |
在使用CURLOPT_FOLLOWLOCATION产生的header中的多个locations中持续追加用户名和密码信息,即使域名已发生改变。 |
|
CURLOPT_UPLOAD |
启用后允许文件上传。 |
|
CURLOPT_VERBOSE |
启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中。 |
|
对于下面的这些option的可选参数,value应该被设置一个integer类型的值:
选项 |
可选value值 |
备注 |
CURLOPT_BUFFERSIZE |
每次获取的数据中读入缓存的大小,但是不保证这个值每次都会被填满。 |
在cURL 7.10中被加入。 |
CURLOPT_CLOSEPOLICY |
不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,还存在另外三个CURLCLOSEPOLICY_,但是cURL暂时还不支持。 |
|
CURLOPT_CONNECTTIMEOUT |
在发起连接前等待的时间,如果设置为0,则无限等待。 |
|
CURLOPT_CONNECTTIMEOUT_MS |
尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。 |
在cURL 7.16.2中被加入。从PHP 5.2.3开始可用。 |
CURLOPT_DNS_CACHE_TIMEOUT |
设置在内存中保存DNS信息的时间,默认为120秒。 |
|
CURLOPT_FTPSSLAUTH |
FTP验证方式:CURLFTPAUTH_SSL (首先尝试SSL),CURLFTPAUTH_TLS (首先尝试TLS)或CURLFTPAUTH_DEFAULT (让cURL自动决定)。 |
在cURL 7.12.2中被加入。 |
CURLOPT_HTTP_VERSION |
CURL_HTTP_VERSION_NONE(默认值,让cURL自己判断使用哪个版本),CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。 |
|
CURLOPT_HTTPAUTH |
使用的HTTP验证方法,可选的值有:CURLAUTH_BASIC、CURLAUTH_DIGEST、CURLAUTH_GSSNEGOTIATE、CURLAUTH_NTLM、CURLAUTH_ANY和CURLAUTH_ANYSAFE。 可以使用|位域(或)操作符分隔多个值,cURL让服务器选择一个支持最好的值。CURLAUTH_ANY等价于CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. CURLAUTH_ANYSAFE等价于CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. |
|
CURLOPT_INFILESIZE |
设定上传文件的大小限制,字节(byte)为单位。 |
|
CURLOPT_LOW_SPEED_LIMIT |
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。 |
|
CURLOPT_LOW_SPEED_TIME |
当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec),PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。 |
|
CURLOPT_MAXCONNECTS |
允许的最大连接数量,超过是会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接。 |
|
CURLOPT_MAXREDIRS |
指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。 |
|
CURLOPT_PORT |
用来指定连接端口。(可选项) |
|
CURLOPT_PROTOCOLS |
CURLPROTO_*的位域指。如果被启用,位域值会限定libcurl在传输过程中有哪些可使用的协议。这将允许你在编译libcurl时支持众多协议,但是限制只是用它们中被允许使用的一个子集。默认libcurl将会使用全部它支持的协议。参见CURLOPT_REDIR_PROTOCOLS. 可用的协议选项为:CURLPROTO_HTTP、CURLPROTO_HTTPS、CURLPROTO_FTP、CURLPROTO_FTPS、CURLPROTO_SCP、CURLPROTO_SFTP、CURLPROTO_TELNET、CURLPROTO_LDAP、CURLPROTO_LDAPS、CURLPROTO_DICT、CURLPROTO_FILE、CURLPROTO_TFTP、CURLPROTO_ALL |
在cURL 7.19.4中被加入。 |
CURLOPT_PROXYAUTH |
HTTP代理连接的验证方式。使用在CURLOPT_HTTPAUTH中的位域标志来设置相应选项。对于代理验证只有CURLAUTH_BASIC和CURLAUTH_NTLM当前被支持。 |
在cURL 7.10.7中被加入。 |
CURLOPT_PROXYPORT |
代理服务器的端口。端口也可以在CURLOPT_PROXY中进行设置。 |
|
CURLOPT_PROXYTYPE |
不是CURLPROXY_HTTP (默认值) 就是CURLPROXY_SOCKS5。 |
在cURL 7.10中被加入。 |
CURLOPT_REDIR_PROTOCOLS |
CURLPROTO_*中的位域值。如果被启用,位域值将会限制传输线程在CURLOPT_FOLLOWLOCATION开启时跟随某个重定向时可使用的协议。这将使你对重定向时限制传输线程使用被允许的协议子集默认libcurl将会允许除FILE和SCP之外的全部协议。这个和7.19.4预发布版本种无条件地跟随所有支持的协议有一些不同。关于协议常量,请参照CURLOPT_PROTOCOLS。 |
在cURL 7.19.4中被加入。 |
CURLOPT_RESUME_FROM |
在恢复传输时传递一个字节偏移量(用来断点续传)。 |
|
CURLOPT_SSL_VERIFYHOST |
1 检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。2 检查公用名是否存在,并且是否与提供的主机名匹配。 |
|
CURLOPT_SSLVERSION |
使用的SSL版本(2 或 3)。默认情况下PHP会自己检测这个值,尽管有些情况下需要手动地进行设置。 |
|
CURLOPT_TIMECONDITION |
如果在CURLOPT_TIMEVALUE指定的某个时间以后被编辑过,则使用CURL_TIMECOND_IFMODSINCE返回页面,如果没有被修改过,并且CURLOPT_HEADER为true,则返回一个"304 Not Modified"的header, CURLOPT_HEADER为false,则使用CURL_TIMECOND_IFUNMODSINCE,默认值为CURL_TIMECOND_IFUNMODSINCE。 |
|
CURLOPT_TIMEOUT |
设置cURL允许执行的最长秒数。 |
|
CURLOPT_TIMEOUT_MS |
设置cURL允许执行的最长毫秒数。 |
在cURL 7.16.2中被加入。从PHP 5.2.3起可使用。 |
CURLOPT_TIMEVALUE |
设置一个CURLOPT_TIMECONDITION使用的时间戳,在默认状态下使用的是CURL_TIMECOND_IFMODSINCE。 |
|
对于下面的这些option的可选参数,value应该被设置一个string类型的值:
选项 |
可选value值 |
备注 |
CURLOPT_CAINFO |
一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义。 . |
|
CURLOPT_CAPATH |
一个保存着多个CA证书的目录。这个选项是和CURLOPT_SSL_VERIFYPEER一起使用的。 |
|
CURLOPT_COOKIE |
设定HTTP请求中"Cookie: "部分的内容。多个cookie用分号分隔,分号后带一个空格(例如, "fruit=apple; colour=red")。 |
|
CURLOPT_COOKIEFILE |
包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。 |
|
CURLOPT_COOKIEJAR |
连接结束后保存cookie信息的文件。 |
|
CURLOPT_CUSTOMREQUEST |
使用一个自定义的请求信息来代替"GET"或"HEAD"作为HTTP请求。这对于执行"DELETE" 或者其他更隐蔽的HTTP请求。有效值如"GET","POST","CONNECT"等等。也就是说,不要在这里输入整个HTTP请求。例如输入"GET /index.html HTTP/1.0rnrn"是不正确的。 Note: 在确定服务器支持这个自定义请求的方法前不要使用。
|
|
CURLOPT_EGDSOCKET |
类似CURLOPT_RANDOM_FILE,除了一个Entropy Gathering Daemon套接字。 |
|
CURLOPT_ENCODING |
HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity","deflate"和"gzip"。如果为空字符串"",请求头会发送所有支持的编码类型。 |
在cURL 7.10中被加入。 |
CURLOPT_FTPPORT |
这个值将被用来获取供FTP"POST"指令所需要的IP地址。"POST"指令告诉远程服务器连接到我们指定的IP地址。这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的IP地址。 |
|
CURLOPT_INTERFACE |
网络发送接口名,可以是一个接口名、IP地址或者是一个主机名。 |
|
CURLOPT_KRB4LEVEL |
KRB4 (Kerberos 4) 安全级别。下面的任何值都是有效的(从低到高的顺序):"clear"、"safe"、"confidential"、"private".。如果字符串和这些都不匹配,将使用"private"。这个选项设置为NULL时将禁用KRB4 安全认证。目前KRB4 安全认证只能用于FTP传输。 |
|
CURLOPT_POSTFIELDS |
全部数据使用HTTP协议中的"POST"操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1¶2=val2&…'或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会被设置成multipart/form-data。 |
|
CURLOPT_PROXY |
HTTP代理通道。 |
|
CURLOPT_PROXYUSERPWD |
一个用来连接到代理的"[username]:[password]"格式的字符串。 |
|
CURLOPT_RANDOM_FILE |
一个被用来生成SSL随机数种子的文件名。 |
|
CURLOPT_RANGE |
以"X-Y"的形式,其中X和Y都是可选项获取数据的范围,以字节计。HTTP传输线程也支持几个这样的重复项中间用逗号分隔如"X-Y,N-M"。 |
|
CURLOPT_REFERER |
在HTTP请求头中"Referer: "的内容。 |
|
CURLOPT_SSL_CIPHER_LIST |
一个SSL的加密算法列表。例如RC4-SHA和TLSv1都是可用的加密列表。 |
|
CURLOPT_SSLCERT |
一个包含PEM格式证书的文件名。 |
|
CURLOPT_SSLCERTPASSWD |
使用CURLOPT_SSLCERT证书需要的密码。 |
|
CURLOPT_SSLCERTTYPE |
证书的类型。支持的格式有"PEM" (默认值), "DER"和"ENG"。 |
在cURL 7.9.3中被加入。 |
CURLOPT_SSLENGINE |
用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。 |
|
CURLOPT_SSLENGINE_DEFAULT |
用来做非对称加密操作的变量。 |
|
CURLOPT_SSLKEY |
包含SSL私钥的文件名。 |
|
CURLOPT_SSLKEYPASSWD |
在CURLOPT_SSLKEY中指定了的SSL私钥的密码。 Note: 由于这个选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。
|
|
CURLOPT_SSLKEYTYPE |
CURLOPT_SSLKEY中规定的私钥的加密类型,支持的密钥类型为"PEM"(默认值)、"DER"和"ENG"。 |
|
CURLOPT_URL |
需要获取的URL地址,也可以在curl_init()函数中设置。 |
|
CURLOPT_USERAGENT |
在HTTP请求中包含一个"User-Agent: "头的字符串。 |
|
CURLOPT_USERPWD |
传递一个连接中需要的用户名和密码,格式为:"[username]:[password]"。 |
addform.php文件
代码如下 | 复制代码 |
</textarea><br> <input type="submit" name="submit" value="提交"/> </form> |
add.php文件
代码如下 | 复制代码 |
<?php $title=$_POST['title'];
//以下用SQL语句添加数据至表 news //以下为关键之处,把从表单获得的数据替换模板中的{title},{content}标记 $handle=fopen($path,"w"); //写入方式打开新闻路径
|
mysql_inc.php数据库连接文件
代码如下 | 复制代码 |
<?php
function __construct($host,$name,$pass,$database,$ut){ }
function query($sql, $type = '') { function show($message = '', $sql = '') { function affected_rows() { function result($query, $row) { function num_rows($query) { function num_fields($query) { function free_result($query) { function insert_id() { function fetch_row($query) { function version() { function close() {
function htmtocode($content){ $db=new mysql("localhost","root","","database","utf8");
|
代码如下 | 复制代码 |
<?php $IDCard = new IDCard(); var_dump($IDCard::isCard($_GET['card'])); /** * 身份证处理类 */ class IDCard { //检证身份证是否正确 public static function isCard($card) { $card = self::to18Card($card); if (strlen($card) != 18) { return false; } $cardBase = substr($card, 0, 17); return (self::getVerifyNum($cardBase) == strtoupper(substr($card, 17, 1))); } //格式化15位身份证号码为18位 public static function to18Card($card) { $card = trim($card); if (strlen($card) == 18) { return $card; } if (strlen($card) != 15) { return false; } // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码 if (array_search(substr($card, 12, 3), array('996', '997', '998', '999')) !== false) { $card = substr($card, 0, 6) . '18' . substr($card, 6, 9); } else { $card = substr($card, 0, 6) . '19' . substr($card, 6, 9); } $card = $card . self::getVerifyNum($card); return $card; } // 计算身份证校验码,根据国家标准gb 11643-1999 private static function getVerifyNum($cardBase) { if (strlen($cardBase) != 17) { return false; } // 加权因子 $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); // 校验码对应值 $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'); $checksum = 0; for ($i = 0; $i < strlen($cardBase); $i++) { $checksum += substr($cardBase, $i, 1) * $factor[$i]; } $mod = $checksum % 11; $verify_number = $verify_number_list[$mod]; return $verify_number; } } ?> |
相关文章
使用PHP+JavaScript将HTML页面转换为图片的实例分享
这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19- 在昨天的《Javascript权威指南》学习笔记之十:ECMAScript 5 增强的对象模型一文中,对于一段代码的调试出现了一个奇怪现象,现将源代码贴在下面: 复制代码 代码如下: <script type="text/javascript"> function Person(){}...2014-05-31
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 复制代码 代码如下: //element:需要添加新样式的元素,value:新的样式 function addClass(element, value ){ if (!element.className){ element.className = value; }else { newClassName = element.className; newClas...2014-05-31
- 在javascritp中,不一定只有对象方法的上下文中才有this, 全局函数调用和其他的几种不同的上下文中也有this指代。 它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript 中函数的调用有以下...2015-03-15
- 首先,我想到的是另建一个结果数组,用来存储原始数组中不重复的数据。遍历原始数组依次跟结果数组中的元素进行比较,检测是否重复。于是乎,我写出了如下代码A: Array.prototype.clearRepetitionA = function(){ var resul...2015-11-08
- 这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
- 事件触发器从字面意思上可以很好的理解,就是用来触发事件的,但是有些没有用过的朋友可能就会迷惑了,事件不是通常都由用户在页面上的实际操作来触发的吗?这个观点不完全正确,因为有些事件必须由程序来实现,如自定义事件,jQue...2014-06-07
- 有一道js面试题,题目是这样的:下列代码的执行结果是什么,为什么? 复制代码 代码如下: var i, j, k; for (i=0, j=0; i<10, j<6; i++, j++) { k = i+j; } document.write(k); 答案是显示10,这道题主要考察JavaScript的逗...2015-03-15
JavaScript学习笔记整理_setTimeout的应用
下面小编就为大家带来一篇JavaScript学习笔记整理_setTimeout的应用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-03- 这篇文章主要介绍了Javascript类型转换的规则实例解析,涉及到javascript类型转换相关知识,对本文感兴趣的朋友一起学习吧...2016-02-27
- 通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素。 HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。 HTML DOM 模型被构造为对象的树: 通过可编程的对象模型,Java...2015-10-23
- 1、ActiveX向Javascript传参 复制代码 代码如下: <script language="javascript" for="objectname" event="fun1(arg)"> fun2(arg); </script> objectname为ActiveX控件名,通过<object>标签里的id属性设定,如下; 复制...2014-06-07
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
下面小编就为大家带来一篇JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-05-20- Window有navigator对象让我们得知浏览器的全部信息.我们可以利用一系列的API函数得知浏览器的信息.JavaScript代码如下:function message(){ txt = "<p>浏览器代码名: " + navigator.appCodeName + "</p>";txt+= "<p>...2015-11-24
- 这篇文章主要为大家介绍了JavaScript设计模式中的装饰者模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
- 神马是“解释器模式”?先翻开《GOF》看看Definition:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。在开篇之前还是要科普几个概念: 抽象语法树: 解释器模式并未解释如...2014-06-07
- 虽然ES6都还没真正发布,但已经有用ES6重写的程序了,各种关于ES789的提议已经开始了,这你敢信。潮流不是我等大众所能追赶的。潮流虽然太快,但我们不停下学习的步伐,就不会被潮流丢下的,下面来领略下ES6中新特性,一堵新生代JS...2015-11-24
- 本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
- 这篇文章主要介绍了JS中的compose函数和pipe函数用法,想深入了解Javascript的同学,可以参考下...2021-04-27