承接前篇動態生成上傳表單,本文提供 PHP 與 Perl 兩版接收程式,實作批次儲存、檔案名解析、大小限制與結果顯示。
<?php
function fup($src, $dest) {
if ($src != "none") {
copy($src, $dest);
unlink($src); // 移動檔案:複製後刪除暫存檔
}
}
for ($i = 0; $i < $cnt; $i++) {
$fileVar = "file$i";
$nameVar = "file${i}_name";
$pathVar = "path$i";
// 除錯輸出原始檔名
print $$nameVar . "<br>";
fup($$fileVar, $$pathVar . $$nameVar);
}
?>
$file0:暫存檔完整路徑$file0_name:原始檔名$file0_size:檔案大小(位元組)$file0_type:MIME 類型程式利用變數變數($$fileVar)動態取得各欄位值,逐一呼叫 fup() 移動至指定路徑。
#!/usr/bin/perl
use CGI qw/:standard/;
# 檢查 multipart/form-data
if ($ENV{'CONTENT_TYPE'} !~ /multipart\/form-data/) {
print "Content-Type: text/html\n\n";
print "<html><body>Your web browser cannot upload files. Sorry.</body></html>";
exit 0;
}
$cntfile = param('cnt');
print header;
print start_html;
for ($i = 0; $i < $cntfile; $i++) {
$paramfile = "file$i";
$parampath = "path$i";
$writed = param($parampath);
&upfile;
&g_body;
}
&g_bott;
# ---------- 子程式 ----------
sub upfile {
$maxdata = 512000; # 500KB 限制
$xfile = param($paramfile); # 暫存檔路徑
# 解析原始檔名(處理 Windows 路徑分隔符)
$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 Allowed\n";
print "Content-Type: text/html\n\n";
print "<html><body><h1>檔案過大,請重試</h1></body></html>";
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>檔案上傳結果</td></tr>';
print '<tr align=center><td>來源檔案</td><td>目的檔案</td><td>結果</td></tr>';
}
sub g_body {
print "<tr><td>$xfile</td><td>$writed$strNetFname</td><td>OK!</td></tr>";
}
sub g_bott { print '</table>'; }
| 特性 | PHP 版 | Perl 版 |
|---|---|---|
| 暫存檔處理 | copy()+unlink() 模擬移動 | File::Copy::copy() 直接複製 |
| 檔名解析 | 直接使用 $fileN_name | 從暫存路徑反向解析檔名 |
| 大小限制 | 未在範例中實作(可加 $fileN_size 判斷) | 內建 500KB 限制,超過回傳 411 |
| 結果顯示 | 僅列印檔名 | 產生 HTML 表格顯示來源/目的/狀態 |
upload_max_filesize、post_max_size 與 Perl $CGI::POST_MAX 限制總上傳大小。兩版程式皆可直接部署,視伺服器環境與開發語言偏好選擇。