程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 讓你同時上傳 1000 個文件

讓你同時上傳 1000 個文件

編輯:關於PHP編程

預備知識:Javascript, PHP(少量)/Perl(少量)!
測試環境:Windows2000 + IIS5 + PHP (Win98 + PWS + PHP3 失敗,估計是配置出了問題)
目錄結構:
/wwwroot/cgi-bin/fileup.php (文件接收)
/wwwroot/www/test/phpfileup.htm (文件提交)
/wwwroot/www/test/tmp/ (默認保存目錄)

前言:文件上傳,簡單又麻煩。下面是上傳文件的提交頁面,利用該頁面你不僅可以生成 1000 個上傳文件框(實際是任意多個 0~n ),而且可分別指出它們的保存路徑。
提交頁面的文件輸入框為命名為: file0,file1,...file100,...fileN
提交頁面的文件路徑框為命名為: path0,path1,...path100,...pathN
由於頁面的生成非常簡單,所以就不在此多解釋了,用 javascript 定義了兩個函數,check() 用於提交頁面,create()用於生成文件上傳框。如果你有什麼更好的建議或有什麼疑問請 Email: [email protected]

phpfileup.htm
--------------------------------------------------------
<html>
<head>
<title></title>
<style>
.lbtn {font-family:verdana;font-size:10.5pt;}
.ist {font-family:verdana;font-size:14.8px;size:400}
</style>

<script LANGUAGE="javascript">
function check(){
document.frm1.submit();
document.body.innerHTML="Uploading Please wait!";
}

var i=0;
function create(){
var sfrm = document.frm1.innerHTML;
var icnt = cnt.value;
for(j=0;j<icnt;j++)
{
sfrm = sfrm + "請選擇文件 "+i+" <input type=file name=file"+i+" class=ist>";
sfrm = sfrm + " 路徑:<input type=text name=path"+i+" value=../www/test/tmp/ class=ist>";
sfrm = sfrm + "<br>";
i++;
}
document.frm1.innerHTML = sfrm;
document.frm1.cnt.value=i;
}

</script>

</head>
<body class=lbtn onload="document.frm1.cnt.value=cnt.value;">
請輸入要上傳文件的數量: <input type=text name=cnt value="10" class=ist onchange="document.frm1.cnt.value=this.value;">
<input type=button name=bt1 value="生成上傳文件框" onclick="create();" class=lbtn>
<input type=button name=bt1 value="上傳" onclick="check();" class=lbtn>
<input type=button name=bt1 value="清除" onclick="document.location.reload();" class=lbtn>

<form name=frm1 method="post" Enctype="multipart/form-data" action="../../cgi-bin/fileup.php">
<input type=hidden name=cnt value="20" class=ist>
</form>

<input type=button name=bt1 value="上傳" onclick="check();" class=lbtn>
<input type=button name=bt1 value="清除" onclick="document.location.reload();" class=lbtn>
</body>
</html>
文件提交頁面既已生成,下面任務就很明確了:將提交的文件內容保存到服務器上。

下面我們用兩種方法來實現這個功能:

1. 用 PHP 來保存:
我們先定義一個文件保存函數 fup() 它有兩個參數:
$filename: 文件內容
$fname: 文件名(包含路徑)
剩下的就是寫一個循環將文件依次寫入服務器。這裡要簡單說明一下:
PHP 對於上傳文件的處理是這樣的:如果提交的文件框我為 file0, 那麼提交給 PHP 的文件內容保存在變量 $file0 中,而文件名則保存在 $file0_name 中。這樣在這個循環中我要做的就是將提交頁面提交的內容分解出來,實現過程請看下面的代碼。

fileup.php
----------------------------------------------------------------------
<?
function fup($filename,$fname)
{ If($filename != "none") {
copy($filename,$fname);
unlink($filename);
}
}

for($i=0;$i<$cnt;$i++)
{
$ffnn="file".$i;
$ffnnname=$ffnn."_name";
$ffpath="path".$i;

//print $$ffnn;
print $$ffnnname;
print "<br>";

fup($$ffnn,$$ffpath.$$ffnnname); //"../www/test/tmp/"
}
?>
----------------------------------------------------------------------

2. 用 PERL 來保存:
它們實現的原理完全一樣,在此不多說,請看代碼:

fileup.cgi(fileup.pl)
----------------------------------------------------------------------
#!/usr/bin/perl

use CGI qw/:standard/;

if ($ENV{CONTENT_TYPE} !~ /multipart/form-data/) {
print "Cache-Control: no-cachenPragma: no-cachen" .
"Content-Type: text/htmlnn" .
"<html><body>Your web browser cannot upload files. Sorry.</body></html>";
exit 0;
}


$cntfile=param(cnt);
print header;
print start_html;
#print "Receiving Please wait....";

&g_head;

#$writed = ../www/test/tmp/;

for ($i=0;$i<$cntfile;$i++){
$paramfile = file.$i;
$parampath=path.$i;

$writed=param($parampath);

&upfile;
&g_body;
}

&g_bott;

#<<<<<<<<<<<<<<<<<<<<<以下為自定義過程<<<<<<<<<<<<<<<<<<<<<<<<<

sub upfile
{
$maxdata = 512000;
# $writed = ../www/test/tmp/;


$strRFname=reverse $xfile;
$intIndex=index($strRFname,);
$strNetFname=substr($strRFname,0,$intIndex);
$strNetFname=scalar reverse $strNetFname;


if((stat $xfile)[7]>$maxdata){
print "Status: 411 Size Not Allowedn" .
"Content-Type: text/htmlnAllow: POSTnn" .
"<html><head><title>411 411 Size Not Allowed</title></head><body><h1> You got big problem. Try again.</h1></body></html>n";
exit 0;
}


binmode $xfile;
use File::Copy;
copy($xfile,$writed.$strNetFname);
}

sub g_head{
print <table border=1 align=center>;
print <tr><td colspan=3 align=center>文件上傳結果(Upload Result)</td></tr>;
print <tr align=center>;
print <td>SourceFile:</td>;
print <td>DestFile:</td>;
print <td>Upload</td>;
print </tr>;
}

sub g_body{
print <tr>;
print <td>.$xfile .</td>;
print <td>.$writed.$strNetFname.</td>;
print <td>OK!</td>;
print </tr>;
}

sub g_bott{
print </table>;
}
----------------------------------------------------------------------
如有好的建議請 Email: [email protected]

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved