首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 與 Perl 實作多檔案批次上傳接收端(下)

     編輯:PHP 綜合知識

伺服器端處理大量檔案上傳:PHP 與 Perl 兩種實作完整代碼

承接前篇動態生成上傳表單,本文提供 PHP 與 Perl 兩版接收程式,實作批次儲存、檔案名解析、大小限制與結果顯示。

一、PHP 版:fileup.php

<?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);
}
?>

PHP 處理上傳變數慣例

  • $file0:暫存檔完整路徑
  • $file0_name:原始檔名
  • $file0_size:檔案大小(位元組)
  • $file0_type:MIME 類型

程式利用變數變數($$fileVar)動態取得各欄位值,逐一呼叫 fup() 移動至指定路徑。

二、Perl 版:fileup.cgi (fileup.pl)

#!/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 表格顯示來源/目的/狀態

安全性建議

  1. 嚴格驗證檔案類型(MIME、副檔名、內容檢查)。
  2. 限制上傳目錄權限,禁止執行權限。
  3. 檔名重命名(如時間戳+亂數)避免覆蓋與路徑遍歷攻擊。
  4. 設定 PHP upload_max_filesize、post_max_size 與 Perl $CGI::POST_MAX 限制總上傳大小。

兩版程式皆可直接部署,視伺服器環境與開發語言偏好選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved