php3是一種非常強大的cgi腳本語言,就其語言特點基本上源于c,就其實現方式而言更象perl,而其對數據庫的內在支持更使之成為asp的強大對手。
首先在前臺必須有一個界面
< html >
< head >
< title >文件上載界面< /title >
< /head >
< body >< table >< center >
< form enctype = "multipart/form-data" name = "submitform"
action = "upload.php3" method = "post" >
< input type = "hidden" name =
"max_file_size" value ="1000000" >
< tr >
< td >< input name = "uploadfile"
type = "file" size = "30" >< /td >
< /tr >
< tr >
< td >< input name = "submit" value =
"提交" type = "submit" >< /td >
< td >< input name = "reset" value =
"重置" type = "reset" >< /td >
< /tr >
< /form >< /center >< /table >< /body >
< /html >
值得注意的是一個 max_file_size 的隱藏值域,通過設置其value 可以限制上載文件的大小。
然后在后臺實現文件上載操作。如果只是最基本的上載,寥寥幾行就可以搞定
< ?
if($uploadfile != "none")
{
copy($uploadfile,"$uploadfile_name");
unlink($uploadfile);
}
else
{
echo "你沒有選擇任何文件上載!";
}
? >
因為form傳遞過來的值自動賦值給同名變量,所以直接通過$uploadfile可以訪問上載的文件,但由于這是一個保存文件的變量,因此文件名字必須通過另外一個$uploadfile_name變量取得。在拷貝文件后刪去臨時文件(unlink)。
上面的代碼完全可以工作,但實際應用中漏洞百出,讓我們逐步來完善之
首先,上載的文件必須有一個固定的目錄保存,我們在這里用一個$uploadpath 變量保存之,如
$uploadpath = "/home/flier/upload/";
或復雜一點的自動定位,如
$uploadpath = addslashes(dirname
($path_translated))."http://upload//";
$path_translated顧名思義是當前傳送目錄,
我們假定以其一個名為upload的子目錄來保存上載的文件。dirname函數返回其目錄名,然后加上子目錄名
然后用一個變量$filename保存完整的上載后文件名和路徑$filename = $uploadpath.$uploadfile_name;
其次,我們還想讓用戶得知上載文件的簡要信息,如上載文件的大小
if($uploadfile_size < 1024)
// 上載文件大小
{
$filesize = (string)$uploadfile_size . " 字節";
}
elseif($uploadfile_size < (1024 * 1024))
{
$filesize = number_format((double)
($uploadfile_size / 1024), 1) . " kb";
}
else
{
$filesize = number_format((double)
($uploadfile_size / (1024 * 1024)), 1) . " mb";
}
number_format函數起到格式化輸出的作用,具體用法請參照手冊
下一步我們必須考慮到文件已經存在和拷貝操作失敗的情況,并提供相應的提示信息
if(!file_exists($filename))
{
if(copy($uploadfile,$filename))
{
echo "文件 $uploadfile_name
($filesize)上載成功!";
}
else
{
echo "文件 $uploadfile_name 上載失敗!";
}
unlink($uploadfile);
}
else
{
echo "文件 $uploadfile_name 已經存在!";
}
然后我們應該考慮到大文件上載時容易出現超時的情況,可以用set_time_limit($timelimit); 加大超時限制時間。
最后,把截面和實現代碼綜合到一個單獨的文件中,為了實現這個想法,我們通過在 form中添加一個隱含值< input type = "hidden" name = "uploadaction" value = "1" > 指出當前的狀態(界面或實現),以便區分對待 完成代碼如下(文件名upload.php3)
< ?
if(!$uploadaction):
? >
< html >
< head >
< title >文件上載界面< /title >
< /head >
< body >< table >< center >
< form enctype = "multipart/form-data" name =
"submitform" action = "upload.php3" method = "post" >
< input type = "hidden" name =
"max_file_size" value ="1000000" >
< input type = "hidden" name = "uploadaction" value = "1" >
< tr >
< td >< input name = "uploadfile" type =
"file" size = "30" >< /td >
< /tr >
< tr >
< td >< input name = "submit" value =
"提交" type = "submit" >< /td >
< td >< input name = "reset" value =
"重置" type = "reset" >< /td >
< /tr >
< /form >< /center >< /table >< /body >
< /html >
< ?
else:
? >
< html >
< head >
< title >文件上載代碼< /title >
< /head >
< body >
< ?
$uploadaction=0;
$timelimit=60; /* 設置超時限制時間
缺省時間為 30 秒
設置為0時為不限時 */
set_time_limit($timelimit);
if(($uploadfile != "none")&&
($uploadfile != ""))
{
$uploadpath = addslashes(dirname
($path_translated))."http://upload//"; // 上載文件存放路徑
$filename = $uploadpath.$uploadfile_name;
// 上載文件名
if($uploadfile_size < 1024)
// 上載文件大小
{
$filesize = (string)$uploadfile_size . " 字節";
}
elseif($uploadfile_size < (1024 * 1024))
{
$filesize = number_format((double)
($uploadfile_size / 1024), 1) . " kb";
}
else
{
$filesize = number_format((double)
($uploadfile_size / (1024 * 1024)), 1) . " mb";
}
if(!file_exists($filename))
{
if(copy($uploadfile,$filename))
{
echo "文件 $uploadfile_name ($filesize)上載成功!";
}
else
{
echo "文件 $uploadfile_name 上載失敗!";
}
unlink($uploadfile);
}
else
{
echo "文件 $uploadfile_name 已經存在!";
}
}
else
{
echo "你沒有選擇任何文件上載!";
}
set_time_limit(30); // 恢復缺省超時設置
? >
< br >< a href = "upload.php3" >返回< /a >
< /body >
< /html >
< ?
endif;
新聞熱點
疑難解答