ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Uploadify 3.2 参数属性、事件、方法函数详解以及配置

Uploadify 3.2 参数属性、事件、方法函数详解以及配置 1. Uploadify 3.2 文件上传组件到底解决了什么问题Uploadify 3.2 是一个基于 jQuery 与 Flash 的文件上传组件核心能力是把「选择文件 → 排队 → 上传 → 进度反馈 → 服务端回调」这一整条链路封装成可配置的插件。它适合谁适合还在维护老后台系统、需要批量上传图片或附件的开发者尤其是那些页面用 jQuery、后端用 PHP/Java 的传统项目。你不需要自己写 FormData 分片逻辑只要把参数配好、事件挂上就能得到一个带队列、带进度条、带错误提示的上传控件。我见过很多项目里 Uploadify 用得很别扭问题往往不在组件本身而在于参数没吃透auto和uploadLimit混着用导致选完文件不自动传fileTypeExts写了但fileTypeDesc没配弹窗提示是英文onUploadSuccess里拿不到服务端返回的 JSON因为successTimeout太短。这些坑本质上都是「参数属性、事件回调、方法函数」三件套没对齐。这篇文章按「配置体系 → 初始化 → 事件时机 → 方法调用 → 报错排查」的顺序拆。每个参数我会给默认值、单位、以及什么时候该改每个事件我会说清楚它在队列的哪个阶段触发、参数对象里有什么每个方法我会给可复制的调用片段。最后给一套完整的初始化配置和验证步骤你照着改路径就能跑。需要说明的是Uploadify 3.2 依赖 Flash现代浏览器已经不再支持 Flash 播放所以它更适合内网老系统或特定兼容环境。如果你在做一个全新项目建议直接看现代上传方案但如果你手上就是这套老代码那这篇就是给你排障用的。2. 参数属性逐项拆解与初始化配置Uploadify 3.2 的参数分几类上传行为类、文件限制类、界面外观类、队列管理类、服务端交互类。先看最容易被误用的几个。auto默认true意思是选择文件后立即上传。如果你要做「先选文件、再填表单、最后点提交」的流程必须设为false否则文件在你填表之前就传走了。配合auto:false时通常要在提交按钮里调upload(*)。fileSizeLimit默认0表示无限制。它支持两种写法整数表示 KB字符串可以用2MB、500KB、1GB。注意它和fileTypeExts是两套校验前者管大小后者管类型。fileTypeExts默认*.*格式是*.doc;*.pdf;*.rar分号隔开。fileTypeDesc必须和fileTypeExts一起用才有效它决定文件选择对话框里的提示文本。fileObjName默认Filedata这个值直接决定后端怎么取文件。PHP 里就是$_FILES[Filedata]如果你改成the_files后端就得写$_FILES[the_files]。很多「上传成功但后端收不到文件」的问题就是这里对不上。formData是 JSON 格式的额外提交数据可以在onUploadStart里用settings方法动态改。典型场景是上传时带上用户 token 或业务 ID。queueID默认false自动生成队列容器。如果你想自己控制队列显示位置就传一个 DOM 元素的 ID。queueSizeLimit默认999注意它限制的是「队列里显示的任务数量」不是「最大上传数量」。真正限制上传数量的是uploadLimit默认也是999超出会触发onUploadError。removeCompleted默认true完成后自动从队列删除removeTimeout默认3单位秒。如果你想让用户看到「已完成」状态久一点把removeTimeout调大或者把removeCompleted设为false。method默认Post一般不用改。preventCaching默认true每次上传自动加随机字符串防缓存这个保持默认就好。swf默认uploadify.swfuploader默认uploadify.php这两个路径必须按你项目实际位置改否则初始化直接失败。下面是一份可直接复制的初始化配置路径按你的项目结构调整$(#file_upload).uploadify({ // 服务端交互 swf : /static/uploadify/uploadify.swf, uploader : /upload/uploadHandler.php, method : Post, fileObjName : Filedata, formData : { token: abc123, bizType: avatar }, // 上传行为 auto : false, multi : true, uploadLimit : 10, queueSizeLimit: 20, removeCompleted: true, removeTimeout: 3, requeueErrors: false, successTimeout: 30, // 文件限制 fileSizeLimit: 5MB, fileTypeExts : *.jpg;*.png;*.gif, fileTypeDesc : 请选择 jpg/png/gif 图片, // 界面 buttonText : 选择文件, buttonClass : upload-btn, buttonCursor : hand, width : 120, height : 30, queueID : file_queue, progressData : percentage, // 事件 onInit : function () { console.log(初始化完成); }, onSelect : function (file) { console.log(已选择 file.name); }, onSelectError: function (file, errorCode, errorMsg) { alert(选择失败 errorMsg); }, onUploadStart: function (file) { $(#file_upload).uploadify(settings, formData, { token: abc123, bizType: avatar, fileName: file.name }); }, onUploadProgress: function (file, bytesUploaded, bytesTotal) { var percent (bytesUploaded / bytesTotal * 100).toFixed(2); console.log(file.name 已上传 percent %); }, onUploadSuccess: function (file, data, response) { console.log(服务端返回 data); }, onUploadError: function (file, errorCode, errorMsg, errorString) { console.error(上传出错 errorMsg / errorString); }, onQueueComplete: function (queueData) { console.log(成功 queueData.uploadsSuccessful 个失败 queueData.uploadsErrored 个); } });这份配置里auto:false配合uploadLimit:10是常见组合用户最多选 10 个文件进队列手动点上传才真正发送。onUploadStart里动态改formData把文件名带上去后端就能按文件名做业务关联。3. 事件回调的触发时机与参数对象Uploadify 3.2 的事件分三类初始化类、选择类、上传类。理解触发时机才能把逻辑挂对地方。初始化类有onInit、onSWFReady、onFallback。onInit在首次初始化结束时触发适合在这里做按钮状态初始化。onSWFReady在 Flash 文件载入成功后触发比onInit更晚一点。onFallback在检测到浏览器不支持 Flash 时触发你可以在这里给用户一个降级提示。选择类有onDialogOpen、onDialogClose、onSelect、onSelectError。onDialogOpen在文件选择对话框弹出时立即触发但可能在对话框关闭前没执行完所以别在这里做重逻辑。onDialogClose在对话框关闭时触发参数queueData包含filesSelected、filesQueued、filesReplaced、filesCancelled、filesErrored五个计数。注意如果你重写了onDialogClose当添加文件出错时不会自动弹错误提示需要自己处理。onSelect在每次向队列添加任务时触发参数file包含id、name、size、type等。onSelectError在选择失败时触发errorCode有四个值QUEUE_LIMIT_EXCEEDED队列超限、FILE_EXCEEDS_SIZE_LIMIT大小超限、ZERO_BYTE_FILE空文件、INVALID_FILETYPE类型不符。错误提示可以通过this.queueData.errorMsg定制。上传类有onUploadStart、onUploadProgress、onUploadSuccess、onUploadError、onUploadComplete、onQueueComplete。onUploadStart在文件即将开始上传时触发这是动态改formData的最后时机。onUploadProgress在上传过程中多次触发参数有bytesUploaded、bytesTotal、totalBytesUploaded、totalBytesTotal适合更新进度条。onUploadSuccess在文件上传成功时触发参数data是服务端输出response为true表示有响应。这里有个坑如果服务端返回的是false超过successTimeout设置的时间后会被假定为true。所以服务端一定要返回明确的成功标识比如 JSON 里的{status:1}。onUploadError在上传出错时触发参数由服务端返回。onUploadComplete在每个文件上传完毕后无论成功与否都触发。onQueueComplete在整个队列处理完毕后触发参数queueData有uploadsSuccessful和uploadsErrored。队列管理类事件还有onCancel、onClearQueue、onDestroy、onDisable、onEnable。onCancel在点击文件队列关闭按钮或取消上传时触发。onClearQueue在调用cancel方法时触发参数是取消数量。onDestroy在destroy方法被调用时触发。onDisable和onEnable分别在禁用和启用按钮时触发。一个实用技巧在onUploadSuccess里判断服务端返回如果业务失败可以手动调cancel把该任务从队列移除避免用户误以为成功。4. 方法函数的调用方式与验证请求Uploadify 3.2 的方法通过$(#file_upload).uploadify(方法名, 参数)调用。常用方法有cancel、destroy、disable、settings、stop、upload。cancel(fileID, suppressEvent)取消队列中的任务。fileID为空取消第一个为*取消所有。suppressEvent设为true时阻止触发onUploadCancel清空队列时很实用。// 取消第一个任务 $(#file_upload).uploadify(cancel); // 清空整个队列 $(#file_upload).uploadify(cancel, *);destroy()销毁实例并恢复按钮原始状态。disable(setDisabled)禁用或启用按钮true禁用false启用。$(#file_upload).uploadify(disable, true); // 禁用 $(#file_upload).uploadify(disable, false); // 启用settings(name, value, resetObjects)获取或设置参数。只传name是获取传name和value是设置。resetObjects设为true时更新postData会清空现有值否则新值追加到末尾。// 获取 buttonText var text $(#file_upload).uploadify(settings, buttonText); // 设置 buttonText $(#file_upload).uploadify(settings, buttonText, BROWSE);stop()停止当前正在上传的任务。upload(fileID)立即上传指定文件*表示上传所有。// 开始上传所有 $(#file_upload).uploadify(upload, *); // 停止上传 $(#file_upload).uploadify(stop);验证请求是否成功分两步。第一步看前端打开浏览器控制台在onUploadSuccess里打印data确认服务端返回。第二步看后端在uploader指向的处理程序里打印$_FILES和$_POST确认文件对象和额外数据都到了。一个最小可用的 PHP 处理程序?php // uploadHandler.php header(Content-Type: application/json); if (!empty($_FILES[Filedata])) { $file $_FILES[Filedata]; $targetDir /var/www/uploads/; $targetFile $targetDir . basename($file[name]); if (move_uploaded_file($file[tmp_name], $targetFile)) { echo json_encode([ status 1, msg 上传成功, path $targetFile, token isset($_POST[token]) ? $_POST[token] : ]); } else { echo json_encode([status 0, msg 移动文件失败]); } } else { echo json_encode([status 0, msg 未收到文件]); }前端onUploadSuccess里解析onUploadSuccess: function (file, data, response) { var res JSON.parse(data); if (res.status 1) { console.log(上传成功路径 res.path); } else { console.error(业务失败 res.msg); } }如果控制台报Uncaught SyntaxError: Unexpected token说明服务端返回的不是合法 JSON检查 PHP 有没有输出多余字符或 BOM。5. 常见报错排查与配置对照Uploadify 3.2 的报错分前端初始化、选择文件、上传过程三类。下面按真实报错对照排查。报错一Uncaught TypeError: $(...).uploadify is not a function这是最常见的问题说明 jQuery 或 uploadify 脚本没加载成功。检查三点jQuery 是否在 uploadify 之前引入jquery.uploadify.min.js路径是否正确swf参数路径是否可访问。打开浏览器 Network 面板看uploadify.swf是否 404。如果 404把swf改成实际路径。报错二local proxy failed或HTTP Error 404这个报错通常出现在上传阶段说明uploader指向的处理程序路径不对或服务端没响应。检查uploader是否写成了相对路径但页面 URL 变了。建议用绝对路径比如/upload/uploadHandler.php。另外确认服务端返回了内容空响应会触发onUploadError。报错三401 Unauthorized如果上传接口需要鉴权而formData里没带 token就会 401。解决方式是在onUploadStart里动态设置formDataonUploadStart: function (file) { $(#file_upload).uploadify(settings, formData, { token: getToken(), fileName: file.name }); }注意settings的第三个参数resetObjects如果传true会清空原有formData一般保持默认。报错四reading choices或Cannot read property choices of undefined这个报错通常和onSelectError里访问了未定义的对象有关。检查onSelectError的参数是否正确接收file、errorCode、errorMsg。另外如果重写了onDialogClose错误提示不会自动弹需要自己处理queueData.filesErrored。报错五OAuth相关报错如果上传接口走 OAuth 鉴权报错信息里会出现OAuth字样。这种情况需要确认 token 是否过期以及formData里的鉴权字段名是否和服务端约定一致。Uploadify 本身不处理 OAuth它只负责把formData提交上去。报错六文件选择后不自动上传检查auto参数。如果设为false必须手动调upload(*)。另外检查uploadLimit是否已达上限超出会触发onUploadError。报错七上传成功但后端收不到文件检查fileObjName和后端取值是否一致。默认是FiledataPHP 里用$_FILES[Filedata]。如果改成别的名字后端也要同步改。另外检查method是否为PostGet方式传不了文件。报错八进度条不动检查progressData参数默认percentage显示百分比speed显示速度。如果进度条完全不动可能是onUploadProgress没触发检查swf是否加载成功。排查时建议按顺序先看控制台报错再看 Network 请求最后看服务端日志。前端报错定位到具体行Network 看请求 URL 和响应状态服务端日志看有没有收到文件和 POST 数据。6. 从配置到落地一套可复用的接入路径把上面的内容串起来一套完整的接入路径是这样的先引入 jQuery 和 uploadify 脚本再准备一个input typefile idfile_upload /和一个队列容器div idfile_queue/div然后按第 2 节的配置初始化最后写服务端处理程序。如果你在维护老系统Uploadify 3.2 的参数体系其实很清晰行为类参数控制「什么时候传」限制类参数控制「传什么」界面类参数控制「长什么样」事件回调控制「传的过程中做什么」方法函数控制「手动干预」。把这五类分开看配置就不会乱。对于需要长期维护上传功能的团队建议把上传配置抽成一个独立的 JS 文件把uploader、swf、fileTypeExts、fileSizeLimit这些容易变的参数做成变量方便不同页面复用。事件回调里只做业务逻辑不做 DOM 操作保持职责单一。如果你在接入过程中需要统一管理 API Key 或做接口鉴权可以到 TaoToken 的 API Keys 页面生成密钥接入文档里有详细的鉴权说明。对于需要长期跑编码任务或 Agent 的场景Coding Plan 提供了更稳定的调用额度。验证模型返回时模型对话页面可以直接测试接口连通性。这些工具配合 Uploadify 的服务端处理程序能把上传链路的鉴权部分补齐。最后提醒一点Uploadify 3.2 依赖 Flash在部分浏览器上需要用户手动允许运行。如果你的项目必须用这套组件建议在页面上加一个兼容性提示引导用户开启 Flash 权限。如果条件允许逐步迁移到现代上传方案是更稳妥的选择。
返回列表