| 參數 | 類型 | 說明 | 示例值 |
title | String | 組件標題欄文本 | "上傳文件" |
formname | String | 文件字段名 (對應 $_FILES['filedata']) | "filedata" |
url | String | 服務端接收地址 | "update.php" |
parameter | String | GET 方式額外參數 | "bs=tyi&id=50" |
typefile | Array | 文件類型過濾器 [描述, 擴展名, ...] | ["Images", "*.jpg;*.png", "JPG", "*.jpg"] |
upsize | Number | 總上傳容量限制 (MB),0/負數無限制 | 0 |
filenum | Number | 文件數量限制,0/負數無限制 | 0 |
size | Number | 單文件大小限制 (MB),支持小數 | 1 |
formid | Array | 需並行 POST 的表單元素 ID 列表 | ['select', 'select2'] |
autoclose | Number | 完成自動關閉延遲 (秒),-1 不關閉 | 1 |
completeclose | Boolean | true 允許手動關閉已完成項 | true |
repeatfile | Boolean | true 過濾重複文件 (按名+大小+修改時間) | true |
returnserver | Boolean | true 等待服務端響應再處理下一個 | true |
md5file | Number | MD5 模式:0關閉 1上傳前算 2算後驗證 3信息驗證再算 | 1 |
loadfileorder | Boolean | true 正序加載隊列 | true |
mixfilenum | Number | 最少文件數才允許開始上傳 | 0 |
listshowtype | Number | 1列表 2縮略圖模式 | 1 |
infodownright | String | 右下角統計文本模板 (%1%=待傳 %2%=已傳) | "等待上傳:%1%個 已上傳:%2%個" |
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 控制模式:
| 模式 | 流程 | 適用場景 |
| 0 | 禁用 MD5 | 小文件、內網、無秒傳需求 |
| 1 | 客戶端計算 MD5 → 上傳文件 (服務端可選驗證) | 通用秒傳,客戶端 CPU 開銷大 (Flash 限制 100MB 以下) |
| 2 | 客戶端計算 MD5 → 提交信息給服務端驗證 → 服務端返回 0(上傳)/2(秒傳) → 客戶端執行 | 雲存儲、去重存儲、大文件秒傳 |
| 3 | 客戶端提交基本信息 → 服務端返回 0(上傳)/1(需算MD5)/2(秒傳) → 客戶端按指令操作 | 智能策略:小文件直傳、大文件算 MD5、已存在秒傳 |
安全與遺棄風險警示
⚠️ 關鍵警告:
- Flash 已於 2020/12/31 官方停止支持,所有主流瀏覽器已移除 Flash Player 插件,此組件在現代瀏覽器完全無法運行。
- 代碼僅供歷史項目維護參考或理解上傳協議設計。
- 新項目務必使用 HTML5 方案:
<input type="file" multiple> + FormData + fetch/XHR + Web Workers (MD5/分片) + Resumable.js/Uppy/WebUploader 等成熟庫。
現代 HTML5 替代方案對比
| 特性 | Flash 組件 | HTML5 (Uppy/Resumable) |
| 瀏覽器兼容 | 需插件 (已死) | 原生支持 (IE10+) |
| 多文件選擇 | 支持 | multiple 屬性原生支持 |
| 分片/斷點續傳 | 內建 | 庫支持 (Resumable.js 基於 HTTP Range) |
| MD5 秒傳 | 內建 (限 100MB) | Web Workers + SparkMD5 (無大小限制) |
| 進度顯示 | 內建 UI | ProgressEvent + 自定義 UI |
| 並發控制 | 參數配置 | 庫配置 / 手動實現 |
| 樣式定制 | XML 顏色配置 | CSS/React/Vue 組件完全可控 |
| 表單數據並行 | formid 機制 | FormData.append() 靈活添加 |
總結
這個 Flash 上傳組件在其時代 (約 2010-2015) 解決了 HTML4 時代多文件、進度、斷點、秒傳等痛點,配置系統極其完善。但隨著 Flash 生態徹底終結,所有基於 SWF 的上傳方案均已成為技術債。現代化遷移應採用 HTML5 原生 API + 成熟前端庫 + 標準化後端 API (支持分片合並、MD5 校驗) 架構,實現零插件、跨平台、可維護的上傳體驗。
- 上一篇文章: PHP 文件上傳類庫設計模式解析:配置驅動、鏈式調用與安全防護
- 下一篇文章: PHP 關鍵字自動提取演算法實作:基於詞頻統計的文本分析
Copyright ©
程式碼之家 All Rights Reserved