php文件上传之原理分析与上传类代码
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
}
};
#*********************************************************
#文件名称: 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(在编辑器KindEditor中用到,请查看upload.php实例)
$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 '
';
echo '文件目录:'.$yl_file_path.'';
echo '
';
echo '原文件名:'.$yl_file_nameold.'';
echo '
';
echo '新文件名:'.$yl_file_names.'';
echo '
';
echo '文件大小:'.$yl_file_size.'';
echo '
';
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 '';
echo '
echo '
echo '';
echo '';
echo '';
echo '';
echo '';
echo '';
exit;
}
}
?>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

「你的組織要求你更改PIN訊息」將顯示在登入畫面上。當在使用基於組織的帳戶設定的電腦上達到PIN過期限制時,就會發生這種情況,在該電腦上,他們可以控制個人設備。但是,如果您使用個人帳戶設定了Windows,則理想情況下不應顯示錯誤訊息。雖然情況並非總是如此。大多數遇到錯誤的使用者使用個人帳戶報告。為什麼我的組織要求我在Windows11上更改我的PIN?可能是您的帳戶與組織相關聯,您的主要方法應該是驗證這一點。聯絡網域管理員會有所幫助!此外,配置錯誤的本機原則設定或不正確的登錄項目也可能導致錯誤。即

Windows11將清新優雅的設計帶到了最前沿;現代介面可讓您個性化和更改最精細的細節,例如視窗邊框。在本指南中,我們將討論逐步說明,以協助您在Windows作業系統中建立反映您的風格的環境。如何更改視窗邊框設定?按+開啟“設定”應用程式。 WindowsI前往個人化,然後按一下顏色設定。顏色變更視窗邊框設定視窗11「寬度=」643「高度=」500「>找到在標題列和視窗邊框上顯示強調色選項,然後切換它旁邊的開關。若要在「開始」功能表和工作列上顯示主題色,請開啟「在開始」功能表和工作列上顯示主題

預設情況下,Windows11上的標題列顏色取決於您選擇的深色/淺色主題。但是,您可以將其變更為所需的任何顏色。在本指南中,我們將討論三種方法的逐步說明,以更改它並個性化您的桌面體驗,使其具有視覺吸引力。是否可以更改活動和非活動視窗的標題列顏色?是的,您可以使用「設定」套用變更活動視窗的標題列顏色,也可以使用登錄編輯程式變更非活動視窗的標題列顏色。若要了解這些步驟,請前往下一部分。如何在Windows11中變更標題列的顏色? 1.使用「設定」應用程式按+開啟設定視窗。 WindowsI前往“個人化”,然

您是否在Windows安裝程式頁面上看到「出現問題」以及「OOBELANGUAGE」語句? Windows的安裝有時會因此類錯誤而停止。 OOBE表示開箱即用的體驗。正如錯誤提示所表示的那樣,這是與OOBE語言選擇相關的問題。沒有什麼好擔心的,你可以透過OOBE螢幕本身的漂亮註冊表編輯來解決這個問題。快速修復–1.點選OOBE應用底部的「重試」按鈕。這將繼續進行該過程,而不會再打嗝。 2.使用電源按鈕強制關閉系統。系統重新啟動後,OOBE應繼續。 3.斷開系統與網際網路的連接。在脫機模式下完成OOBE的所

工作列縮圖可能很有趣,但它們也可能分散注意力或煩人。考慮到您將滑鼠懸停在該區域的頻率,您可能無意中關閉了重要視窗幾次。另一個缺點是它使用更多的系統資源,因此,如果您一直在尋找一種提高資源效率的方法,我們將向您展示如何停用它。不過,如果您的硬體規格可以處理它並且您喜歡預覽版,則可以啟用它。如何在Windows11中啟用工作列縮圖預覽? 1.使用「設定」應用程式點擊鍵並點選設定。 Windows按一下系統,然後選擇關於。點選高級系統設定。導航至“進階”選項卡,然後選擇“效能”下的“設定”。在「視覺效果」選

在Windows11上的顯示縮放方面,我們都有不同的偏好。有些人喜歡大圖標,有些人喜歡小圖標。但是,我們都同意擁有正確的縮放比例很重要。字體縮放不良或圖像過度縮放可能是工作時真正的生產力殺手,因此您需要知道如何自訂以充分利用系統功能。自訂縮放的優點:對於難以閱讀螢幕上的文字的人來說,這是一個有用的功能。它可以幫助您一次在螢幕上查看更多內容。您可以建立僅適用於某些監視器和應用程式的自訂擴充功能設定檔。可以幫助提高低階硬體的效能。它使您可以更好地控制螢幕上的內容。如何在Windows11

螢幕亮度是使用現代計算設備不可或缺的一部分,尤其是當您長時間注視螢幕時。它可以幫助您減輕眼睛疲勞,提高易讀性,並輕鬆有效地查看內容。但是,根據您的設置,有時很難管理亮度,尤其是在具有新UI更改的Windows11上。如果您在調整亮度時遇到問題,以下是在Windows11上管理亮度的所有方法。如何在Windows11上變更亮度[10種方式解釋]單一顯示器使用者可以使用下列方法在Windows11上調整亮度。這包括使用單一顯示器的桌上型電腦系統以及筆記型電腦。讓我們開始吧。方法1:使用操作中心操作中心是訪問

許多用戶在選擇智慧型手錶的時候都會選擇的華為的品牌,其中華為GT3pro和GT4都是非常熱門的選擇,不少用戶都很好奇華為GT3pro和GT4有什麼區別,下面就給大家介紹一下二者。華為GT3pro和GT4有什麼差別一、外觀GT4:46mm和41mm,材質是玻璃鏡板+不鏽鋼機身+高分纖維後殼。 GT3pro:46.6mm和42.9mm,材質是藍寶石玻璃鏡+鈦金屬機身/陶瓷機身+陶瓷後殼二、健康GT4:採用最新的華為Truseen5.5+演算法,結果會更加的精準。 GT3pro:多了ECG心電圖和血管及安
