php文件上传之原理分析与上传类代码
今天研究PHP注册POST/GET大变量的时候,看到了关于这块的一些东西,跟踪了半天,先记录下来,免得以后再如此麻烦的跟踪.
处理器注册:
[mod_php5.c, mod_php5] php_init_handler(server_rec *s, pool *p) ->[main/SAPI.c]sapi_startup(&apache_sapi_module) ->[main/SAPI.c] sapi_globals_ctor(&sapi_globals) ->[main/php_content_types.c]php_setup_sapi_content_types(TSRMLS_C) ->[main/php_content_types.c php_post_entries如下]sapi_register_post_entries(php_post_entries TSRMLS_CC) ->[main/SAPI.c]sapi_register_post_entry(p TSRMLS_CC)
如下面的代码,共注册了俩个处理器,分别处理post数据和文件上传.
注1:参看在PHP Module中获取$_GET/$_POST/$_COOKIE的方法研究
[main/rfc1867.h]
#define
MULTIPART_CONTENT_TYPE
"multipart/form-data"
[main/php_content_types.h]
#define
DEFAULT_POST_CONTENT_TYPE
"application/x-www-form-urlencoded"
[main/SAPI.c]
struct
_sapi_post_entry
{
char *content_type;
uint
content_type_len;
void
(*post_reader)(TSRMLS_D);
void
(*post_handler)(char *content_type_dup, void *arg
TSRMLS_DC);
};
[main/php_content_types.c]
static
sapi_post_entry
php_post_entries[] = {
{
DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_std_post_handler
},
{
MULTIPART_CONTENT_TYPE, sizeof(MULTIPART_CONTENT_TYPE)-1, NULL, rfc1867_post_handler
},
{
NULL, 0, NULL, NULL
}
};<?php
//*********************************************************
//文件名称: yl_upload.class.php
//功能描述: 印像上传类
//程序制作:留印(adleyliu)
//联系qq :14339095
//联系邮箱:adleyliu@163.com
//最后更新: 2007-11-11
//注:转发时请保留此声明信息,这段声明不并会影响你的速度!
//如有修改请将修改后的文件以邮件形式发送给作者一份,谢谢!
//
//*********************************************************
/*
//使用说明:
//声明一个上传类
$yl_upload = new yl_upload_class();
//设置参数
global $yl_filedata,$yl_directroy,$file_urldirectroy,$yl_settingsnew;
global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext;
$yl_filedata = 'filedata';//表单名
$yl_directroy = '../upload_file';//上传主目录
$file_urldirectroy = 'upload_file';//文件url(http://pic2.phprm.com/2014/08/02/在编辑器KindEditor中用到,请查看upload.jpg)
$yl_settingsnew = 'month_'.date('Ym');//上传主目录1按版块存入不同目录,2按月份存入不同目录,3按天存入不同目录
$yl_maxsize = 2097152; //这里以字节为单位(1024*2)*1024=2097152 = 2M
$yl_sizeformat = 'k'; //显示文件大小单位b,k,m
$yl_arrext = array('gif','jpg','jpeg','png','bmp');//允许上传文件类型
$yl_ext = 0; //0原文件类型上传,1统一为存为jpg
//上传
$yl_upload -> yl_uploadfile();
*/
class yl_upload_class {
//*********************************************************
//创建目录函数
//*********************************************************
function createfolder($yl_path) {
if (!file_exists($yl_path)) {
$this->createfolder(dirname($yl_path));
@mkdir($yl_path, 0777);
}
return $this->createfolder;
}
//*********************************************************
//获取文件名称,大小,类型,临时文件名
//*********************************************************
function yl_getfilename($yl_type) {
global $yl_filedata, $yl_directroy, $yl_settingsnew;
global $yl_maxsize, $yl_sizeformat, $yl_arrext, $yl_ext;
return $_FILES[$yl_filedata][$yl_type];
}
//*********************************************************
//获取文件大小
//*********************************************************
function yl_getfilesize() {
global $yl_filedata, $yl_directroy, $yl_settingsnew;
global $yl_maxsize, $yl_sizeformat, $yl_arrext, $yl_ext;
if ($this->yl_getfilename('size') == 0) {
$this->alert("请选择上传文件!");
exit;
}
if ($this->yl_getfilename('size') > $yl_maxsize) {
$yl_maxsizek = $yl_maxsize / 1024;
$this->alert("上传文件超出限制范围$yl_maxsizek.K!");
exit;
}
switch (strtolower($yl_sizeformat)) {
case 'b':
return $this->yl_getfilename('size') . ' B';
break;
case 'k':
return ($this->yl_getfilename('size') / 1024) . ' K';
break;
case 'm':
return ($this->yl_getfilename('size')) / (1024 * 1024) . ' M';
}
}
//*********************************************************
//获得文件扩展名
//*********************************************************
function yl_getfiletype() {
global $yl_filedata, $yl_directroy, $yl_settingsnew;
global $yl_maxsize, $yl_sizeformat, $yl_arrext, $yl_ext;
$yl_temp_arr = explode(".", $this->yl_getfilename('name'));
$yl_file_ext = array_pop($yl_temp_arr);
$yl_file_ext = trim($yl_file_ext);
$yl_file_ext = strtolower($yl_file_ext);
//检查扩展名
if (in_array($yl_file_ext, $yl_arrext) === false) {
$this->alert("上传文件类型被限制!");
exit;
}
return $yl_file_ext;
}
//*********************************************************
//上传
//*********************************************************
function yl_uploadfile() {
global $yl_filedata, $yl_directroy, $file_urldirectroy, $yl_settingsnew;
global $yl_maxsize, $yl_sizeformat, $yl_arrext, $yl_ext;
$yl_file_nameold = $this->yl_getfilename('name'); //原文件名
$yl_file_namenews = date('Ymd') . '_' . md5(date('YmdHis')); //重命名
if ($yl_ext == 0) {
$yl_file_names = $yl_file_namenews . '.' . $this->yl_getfiletype(); //改名
} elseif ($yl_ext == 1) {
$yl_file_names = $yl_file_namenews . '.jpg'; //统一改名为jpg
}
$yl_tmp_name = $this->yl_getfilename('tmp_name'); //服务器上临时文件名
$yl_file_size = $this->yl_getfilesize(); //获取文件大小
$yl_file_type = $this->yl_getfiletype(); //获取文件类型
$yl_file_path = $yl_directroy . '/' . $yl_settingsnew; //建立一个目录
//检查目录是否存在,不存在则创建
if (@is_dir($yl_file_path) === false) {
$this->createfolder('' . $yl_file_path . ''); //创建目录
}
//检查是否已上传
if (@is_uploaded_file($yl_tmp_name) === false) {
$this->alert("文件已上传!");
exit;
}
//检查目录写权限
if (@is_writable($yl_file_path) === false) {
$this->alert("上传目录没有写权限!");
exit;
}
$yl_doupload = @copy($yl_tmp_name, '' . $yl_file_path . '/' . $yl_file_names . '');
if ($yl_doUpload === false) {
$this->alert("上传失败!");
} else {
echo '上传成功';
echo '<br>';
echo '文件目录:' . $yl_file_path . '';
echo '<br>';
echo '原文件名:' . $yl_file_nameold . '';
echo '<br>';
echo '新文件名:' . $yl_file_names . '';
echo '<br>';
echo '文件大小:' . $yl_file_size . '';
echo '<br>';
echo '文件类型:' . $yl_file_type . '';
}
return;
}
//*********************************************************
//*删除文件
//*********************************************************
function delfile() {
global $yl_filedata, $yl_directroy, $yl_settingsnew;
global $yl_maxsize, $yl_sizeformat, $yl_arrext, $yl_ext;
$yl__dir = dirname(trim($yl_directroy));
if ($this->_isDel($yl__dir)) {
return @unlink($yl_directroy) ? true : false;
} else {
return false;
}
}
//*********************************************************
//删除目录 目录下如果有文件不能删除
//*********************************************************
function deldir() {
global $yl_filedata, $yl_directroy, $yl_settingsnew;
global $yl_maxsize, $yl_sizeformat, $yl_arrext, $yl_ext;
if ($this->_isdel($yl_directroy) && is_dir($yl_directroy)) {
return @rmdir($yl_directroy) ? true : false;
} else {
return false;
}
}
//*********************************************************
//提示
//*********************************************************
function alert($yl_msg) {
echo '<html>';
echo '<head>';
echo '<title>error</title>';
echo '<meta http-equiv="content-type" c>';
echo '</head>';
echo '<body>';
echo '<script type="text/网页特效">alert("' . $yl_msg . '");;</script>';
echo '</body>';
echo '</html>';
exit;
}
}
?>本文地址:http://www.phprm.com/scxz/fs4164.html
转载随意,但请附上文章地址:-)