Flash 技术早已被淘汰,主流浏览器(如 Chrome、Firefox、Edge、Safari)已经默认禁用了 Flash 插件。flashupload 这个组件在现代 Web 开发中几乎不再使用。

(图片来源网络,侵删)
为了知识完整性,或者如果您在维护一个非常老旧的项目,下面我将详细解释其工作原理和核心参数。
flashupload 是什么?
flashupload 通常是一个基于 Adobe Flash 技术开发的文件上传组件,它的主要优势(在当年)是:
- 多文件上传:可以一次性选择多个文件进行上传,而无需使用 HTML4
<input type="file">的重复。 - 上传进度显示:可以实时显示每个文件的上传进度条。
- 拖拽上传:支持将文件拖拽到上传区域进行上传。
- 更好的样式控制:开发者可以自定义上传按钮和界面的外观,而不受浏览器原生控件的限制。
核心工作原理
flashupload 的工作流程通常如下:
- 嵌入 Flash:在 HTML 页面中,使用
<object>或<embed>标签将一个 SWF 文件(Flash 程序)嵌入到页面的指定位置。 - JavaScript 通信:页面上的 JavaScript 代码通过
ExternalInterfaceAPI 与这个 SWF 文件进行通信。- 调用 Flash:JS 可以调用 Flash 内部定义的函数,
browse()(打开文件选择对话框)、upload()(开始上传)、clear()(清空列表)。 - Flash 回调 JS:Flash 在执行过程中(如文件选择完成、上传进度、上传成功或失败)会调用 JS 中预先定义好的回调函数,并将数据(如文件名、大小、进度百分比)传递给 JS。
- 调用 Flash:JS 可以调用 Flash 内部定义的函数,
- 后端交互:Flash 内部使用
FileReference.upload()方法将文件数据通过 HTTP POST 请求发送到服务器指定的 URL。
主要参数解析
参数通常分为两部分:SWF 文件初始化参数 和 JavaScript 接口参数。
SWF 初始化参数
这些参数是在嵌入 SWF 时传递给 Flash 程序的,通常定义了 Flash 的基本行为。
| 参数名 | 类型 | 描述 | 示例 |
|---|---|---|---|
upload_url |
String | 必需,服务器端接收文件上传的脚本地址。 | "upload.php" |
file_post_name |
String | 上传文件时,表单中 input 的 name 属性,后端通过此名获取文件。 |
"file_data" |
post_params |
Object | 非常重要,随文件一起提交到服务器的额外参数,通常是一个键值对对象。 | { "uid": 123, "type": "avatar" } |
file_types |
String | 允许用户选择的文件类型过滤器,格式为 "描述扩展名*扩展名"。 | "Images (*.jpg; *.gif)\*.jpg; *.gif" |
file_size_limit |
String | 单个文件大小的限制,可以是数字(单位字节)或带单位的字符串(如 "10MB", "500KB")。 | "5MB" |
use_query_string |
Boolean | 是否将 post_params 的参数附加到 URL 的查询字符串中,而不是放在 POST 请求体里,默认为 false。 |
true |
http_success |
Array | 定义哪些 HTTP 状态码被认为是“成功”的,默认只有 [200],如果后端在某些情况下返回 201 或 204 表示成功,可以在这里添加。 |
[200, 201, 204] |
queue_complete_handler |
String | JS 回调函数名,当所有文件在队列中上传完成后,调用的 JS 函数名。 | "onAllUploadsComplete" |
upload_progress_handler |
String | JS 回调函数名,当某个文件的上传进度更新时,调用的 JS 函数名。 | "onUploadProgress" |
upload_error_handler |
String | JS 回调函数名,当某个文件上传失败时,调用的 JS 函数名。 | "onUploadError" |
upload_success_handler |
String | JS 回调函数名,当某个文件上传成功时,调用的 JS 函数名。 | "onUploadSuccess" |
JavaScript 接口参数与方法
这些是你在页面上通过 JavaScript 调用和控制 Flash 组件的方法。
初始化方法
通常在页面加载完成后,调用一个初始化函数来设置好所有回调。
function initUploader() {
// 假设 Flash 的 ID 是 "myFlashUpload"
var uploader = document.getElementById("myFlashUpload");
// 设置回调函数
uploader.queue_complete_handler = "onAllUploadsComplete";
uploader.upload_progress_handler = "onUploadProgress";
uploader.upload_error_handler = "onUploadError";
uploader.upload_success_handler = "onUploadSuccess";
}
核心控制方法
| 方法名 | 描述 | 示例 |
|---|---|---|
browse() |
打开系统的文件选择对话框,让用户选择文件,选择后,文件会进入上传队列。 | uploader.browse(); |
upload() |
开始上传队列中的所有文件。 | uploader.upload(); |
cancel(fileId) |
取消上传队列中指定 ID 的文件。 | uploader.cancel('file_123'); |
stop() |
停止所有正在进行的上传。 | uploader.stop(); |
clearQueue() |
清空上传队列,移除所有已选择的文件。 | uploader.clearQueue(); |
getFile(fileId) |
根据文件 ID 获取队列中文件的信息对象。 | var file = uploader.getFile('file_123'); |
getQueue() |
获取当前上传队列中所有文件的信息数组。 | var queue = uploader.getQueue(); |
回调函数
这些函数由 Flash 在特定事件触发时调用,你需要在全局作用域中定义它们。
// 当单个文件上传成功时被调用
// event: 包含 file, serverData, 等
function onUploadSuccess(event) {
console.log("文件 " + event.file.name + " 上传成功!");
console.log("服务器返回: " + event.serverData);
// 可以在这里更新页面,比如显示缩略图
}
// 当单个文件上传进度更新时被调用
// event: 包含 file, loaded, total, percent
function onUploadProgress(event) {
var percent = Math.round(event.percent);
console.log("文件 " + event.file.name + " 上传进度: " + percent + "%");
// 可以在这里更新进度条
}
// 当单个文件上传失败时被调用
// event: 包含 file, errorCode, message
function onUploadError(event) {
console.error("文件 " + event.file.name + " 上传失败: " + event.message);
}
// 当队列中所有文件都上传完成时被调用
function onAllUploadsComplete() {
console.log("所有文件上传完毕!");
}
现代替代方案
由于 Flash 已死,现代 Web 开发中应使用以下技术替代 flashupload:
-
HTML5 File API:这是最核心的替代方案。
<input type="file" multiple>:原生支持多文件选择。FileReaderAPI:用于读取文件内容(如预览图片)。FormData对象:用于将文件和表单数据打包,通过XMLHttpRequest或fetch发送到服务器。XMLHttpRequest.upload.onprogress:可以方便地监听上传进度。
-
成熟的 JavaScript 上传库:这些库封装了复杂的细节,提供了更强大的功能。
- Plupload:一个非常经典和强大的多运行时上传器,支持 HTML5, Flash, Silverlight, Gears 等作为“运行时”,可以优雅地降级,即使现在,它也是一个很好的选择。
- Dropzone.js:专注于拖拽上传,非常易用,开箱即用。
- Uploadify:一个基于 jQuery 的上传组件,功能丰富,有免费和商业版本。
- tus.io:一个基于 HTTP 的、可恢复的、开源的文件上传协议,特别适合大文件上传。
| 特性 | flashupload (旧) |
现代方案 (HTML5 + JS库) |
|---|---|---|
| 技术基础 | Adobe Flash | HTML5 File API, JavaScript |
| 浏览器兼容性 | 差,依赖已淘汰的插件 | 好,所有现代浏览器都支持 |
| 安全性 | 较差,Flash 本身有很多安全漏洞 | 高,在沙箱环境中运行 |
| 功能 | 基本功能(多文件、进度、拖拽) | 功能更强大,如分片上传、断点续传、图片压缩等 |
| 易用性 | 需要嵌入 SWF,配置复杂 | API 友好,封装完善,易于集成 |
| 未来 | 已死,不推荐使用 | 主流,是当前和未来的标准 |
如果您正在开发新项目,请务必选择现代的 HTML5 + JavaScript 库方案,如果您在维护旧项目,可以考虑将其逐步迁移到新的技术栈上。
