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

Flash 多文件上傳組件整合指南:前端配置參數詳解與後端 PHP 處理邏輯

     編輯:PHP 相關知識

組件架構概覽

基於 Flash (SWF) 的多文件上傳組件 (update.swf),通過 ExternalInterface 與 JavaScript 交互,提供比傳統 <input type="file"> 更豐富的體驗:

  • 多文件隊列管理 (添加/移除/排序/過濾重複)
  • 客戶端文件類型/大小/數量預檢
  • 分片上傳、斷點續傳、MD5 秒傳
  • 實時進度條、速度、剩餘時間顯示
  • 自定義表單數據並行提交
  • 豐富的皮膚/樣式定制

前端初始化配置 (challs_flash_update())

返回配置對象,關鍵參數解析:

JavaScript 事件回調

// 單文件上傳完成
function challs_flash_oncomplete(fileInfo) {
    // fileInfo: {filename, filesize, updatetime, filetype}
    document.getElementById('show').innerHTML += 
        `${fileInfo.filename} --- ${fileInfo.filesize}字節 ---- 類型:${fileInfo.filetype} --- 用時 ${fileInfo.updatetime/1000}秒<br><br>`;
}

// 服務端響應數據
function challs_flash_oncompletedata(responseText) {
    document.getElementById('show').innerHTML += '<font color="#ff0000">服務端響應:</font><br/>' + responseText + '<br/>';
}

// 開始上傳單文件 (返回 false 可取消)
function challs_flash_onstart(fileInfo) { return true; }

// 全部完成
function challs_flash_oncompleteall(failCount) { /* ... */ }

// 發生錯誤
function challs_flash_onerror(errInfo) { /* errInfo: {texterr, filename, filesize, filetype} */ }

// 表單數據收集器 (配合 formid 使用)
function challs_flash_formdata(elementId) { /* 返回元素值 */ }

// 樣式定制
function challs_flash_style() { /* 返回顏色配置對象 */ }

後端 PHP 處理邏輯 (update.php)

核心處理流程

<?php
mb_http_input('UTF-8');
mb_http_output('UTF-8');

// --- MD5 秒傳/斷點續傳協議處理 ---
$cmd = $_GET['access2008_cmd'] ?? '';
if ($cmd === '2') { // 客戶端已計算 MD5,提交驗證
    // $_GET['access2008_file_name/size/type/md5']
    die('0'); // 0=開始上傳 2=秒傳跳過
}
if ($cmd === '3') { // 客戶端提交文件信息,服務端決定是否需 MD5
    die('1'); // 1=要求客戶端計算 MD5 並進入 cmd=2 流程
}

// --- 常規上傳處理 ---
// 注意:Flash 上傳 $_FILES['type'] 不可靠,需自行檢測
$ext = strtolower(strrchr($_FILES['filedata']['name'], '.'));
$allowed = ['.gif', '.png', '.jpeg', '.jpg', '.bmp'];
$maxSize = 200000; // 200KB

if (in_array($ext, $allowed) && $_FILES['filedata']['size'] < $maxSize) {
    if ($_FILES['filedata']['error'] > 0) {
        echo "錯誤碼: " . $_FILES['filedata']['error'];
    } else {
        $name = $_FILES['filedata']['name'];
        $tmp  = $_FILES['filedata']['tmp_name'];

        if (file_exists($name)) {
            echo "$name 已存在";
        } else {
            move_uploaded_file($tmp, './' . $name);
            echo "保存至: $name<br/>";
            echo "MD5驗證: " . ($_GET['access2008_file_md5'] ?? '無') . "<br/>";
            echo "表單數據: select=" . ($_POST['select'] ?? '') . ", select2=" . ($_POST['select2'] ?? '');
        }
    }
} else {
    echo "類型或大小不符: $ext, " . ($_FILES['filedata']['size']/1024) . "KB";
}

// 輔助函數
function filekzm($a) { return strrchr($a, '.') ?: ''; }
function getget($v) { return $_GET[$v] ?? ''; }
function getpost($v) { return $_POST[$v] ?? ''; }
?>

MD5 秒傳/斷點續傳協議詳解

組件參數 md5file 控制模式:

參數類型說明示例值
titleString組件標題欄文本"上傳文件"
formnameString文件字段名 (對應 $_FILES['filedata'])"filedata"
urlString服務端接收地址"update.php"
parameterStringGET 方式額外參數"bs=tyi&id=50"
typefileArray文件類型過濾器 [描述, 擴展名, ...]["Images", "*.jpg;*.png", "JPG", "*.jpg"]
upsizeNumber總上傳容量限制 (MB),0/負數無限制0
filenumNumber文件數量限制,0/負數無限制0
sizeNumber單文件大小限制 (MB),支持小數1
formidArray需並行 POST 的表單元素 ID 列表['select', 'select2']
autocloseNumber完成自動關閉延遲 (秒),-1 不關閉1
completecloseBooleantrue 允許手動關閉已完成項true
repeatfileBooleantrue 過濾重複文件 (按名+大小+修改時間)true
returnserverBooleantrue 等待服務端響應再處理下一個true
md5fileNumberMD5 模式:0關閉 1上傳前算 2算後驗證 3信息驗證再算1
loadfileorderBooleantrue 正序加載隊列true
mixfilenumNumber最少文件數才允許開始上傳0
listshowtypeNumber1列表 2縮略圖模式1
infodownrightString右下角統計文本模板 (%1%=待傳 %2%=已傳)"等待上傳:%1%個 已上傳:%2%個"

安全與遺棄風險警示

⚠️ 關鍵警告:
  • Flash 已於 2020/12/31 官方停止支持,所有主流瀏覽器已移除 Flash Player 插件,此組件在現代瀏覽器完全無法運行。
  • 代碼僅供歷史項目維護參考或理解上傳協議設計。
  • 新項目務必使用 HTML5 方案:<input type="file" multiple> + FormData + fetch/XHR + Web Workers (MD5/分片) + Resumable.js/Uppy/WebUploader 等成熟庫。

現代 HTML5 替代方案對比

模式流程適用場景
0禁用 MD5小文件、內網、無秒傳需求
1客戶端計算 MD5 → 上傳文件 (服務端可選驗證)通用秒傳,客戶端 CPU 開銷大 (Flash 限制 100MB 以下)
2客戶端計算 MD5 → 提交信息給服務端驗證 → 服務端返回 0(上傳)/2(秒傳) → 客戶端執行雲存儲、去重存儲、大文件秒傳
3客戶端提交基本信息 → 服務端返回 0(上傳)/1(需算MD5)/2(秒傳) → 客戶端按指令操作智能策略:小文件直傳、大文件算 MD5、已存在秒傳

總結

這個 Flash 上傳組件在其時代 (約 2010-2015) 解決了 HTML4 時代多文件、進度、斷點、秒傳等痛點,配置系統極其完善。但隨著 Flash 生態徹底終結,所有基於 SWF 的上傳方案均已成為技術債。現代化遷移應採用 HTML5 原生 API + 成熟前端庫 + 標準化後端 API (支持分片合並、MD5 校驗) 架構,實現零插件、跨平台、可維護的上傳體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性Flash 組件HTML5 (Uppy/Resumable)
瀏覽器兼容需插件 (已死)原生支持 (IE10+)
多文件選擇支持multiple 屬性原生支持
分片/斷點續傳內建庫支持 (Resumable.js 基於 HTTP Range)
MD5 秒傳內建 (限 100MB)Web Workers + SparkMD5 (無大小限制)
進度顯示內建 UIProgressEvent + 自定義 UI
並發控制參數配置庫配置 / 手動實現
樣式定制XML 顏色配置CSS/React/Vue 組件完全可控
表單數據並行formid 機制FormData.append() 靈活添加