?
一、简介和示例
SWFUpload is a small JavaScript/Flash library to get the best of both worlds. It features the great upload capabilities of Flash and the accessibility and ease of HTML/CSS。
官方站点:http://www.swfupload.org/
简单来说,swfupload这个上传库是可以显示上传进度以及上传速度等上传信息。一般实现这种上传体验有2种方式,一种是异步上传,在服务器端边接收数据边往session写入接收的字节数和进度数据,然后客户端轮询这个记录在session的进度数据并回显到页面。第二种方式就是采用 flash来上传,也就是swfupload所采用的方式,在发送过程中将发送的相关状态数据回传到js的函数中处理。
下面是一个单个文件上传的使用示例,简单的创建一个SWFUpload对象,并传入相关的事件处理和参数就可以了:
02 |
???????? window.onload = function () {
|
03 |
???????????? swfu = new SWFUpload({
|
04 |
???????????????? // Backend settings
|
05 |
???????????????? upload_url: "/upload" ,
|
06 |
???????????????? file_post_name: "image" ,
|
07 |
???????????????? // Flash file settings
|
08 |
???????????????? file_size_limit : "10 MB" ,
|
09 |
???????????????? file_types : "*.*" ,???????? // or you could use something like: "*.doc;*.wpd;*.pdf",
|
10 |
???????????????? file_types_description : "All Files" ,
|
11 |
???????????????? file_upload_limit : "0" ,
|
12 |
???????????????? file_queue_limit : "5" ,
|
13 |
???????????????? // Event handler settings
|
14 |
???????????????? swfupload_loaded_handler : swfUploadLoaded,
|
16 |
???????????????? file_dialog_start_handler: fileDialogStart,
|
17 |
???????????????? file_queued_handler : fileQueued,
|
18 |
???????????????? file_queue_error_handler : fileQueueError,
|
19 |
???????????????? file_dialog_complete_handler : fileDialogComplete,
|
21 |
???????????????? //upload_start_handler : uploadStart,?? // I could do some client/JavaScript validation here,but I don't need to.
|
22 |
???????????????? upload_progress_handler : uploadProgress,
|
23 |
???????????????? upload_error_handler : uploadError,
|
24 |
???????????????? upload_success_handler : uploadSuccess,
|
25 |
???????????????? upload_complete_handler : uploadComplete,
|
26 |
???????????????? // Button Settings
|
27 |
???????????????? button_image_url : "/static/images/XPButtonUploadText_61x22.png" ,
|
28 |
???????????????? button_placeholder_id : "spanButtonPlaceholder" , //flash元素要替代的html元素
|
29 |
???????????????? button_width: 61,
|
30 |
???????????????? button_height: 22,
|
32 |
???????????????? // Flash Settings
|
33 |
???????????????? flash_url : "/static/swf/swfupload.swf" ,
|
34 |
???????????????? custom_settings : {
|
35 |
???????????????????? progress_target : "fsUploadProgress" ,
|
36 |
???????????????????? upload_successful : false
|
二、参数说明
原理是很明显易懂的,关键是flash和javascript的通讯部分,在文件上传的各个状态都会有javascript和flash函数的相互回调。目前主要研究了上传单个文件的上传逻辑,swfupload支持多个文件上传的,不过核心的逻辑应该是没有太多的变化。swfupload用一个队列来管理多个文件上传的,因为在传入的参数中会有一些队列和文件上传数量相关的参数。
在其核心的JavaScript文件swfupload.js定义的状态码以及从flash传递到js的文件对象:
03 |
???? "id" :SWFUpload_0_0,
|
06 |
???? "name" :vim-cheat-sheet-diagram.png,
|
09 |
???? "creationdate" :Fri Jan 16 1970 00:08:13 GMT+0800 (CST),
|
10 |
???? "modficationdate" :Fri Jan 16 1970 00:08:13 GMT+0800 (CST),
|
15 |
SWFUpload.QUEUE_ERROR = { |
16 |
???? QUEUE_LIMIT_EXCEEDED??????????? : -100,
|
17 |
???? FILE_EXCEEDS_SIZE_LIMIT???????? : -110,
|
18 |
???? ZERO_BYTE_FILE????????????????? : -120,
|
19 |
???? INVALID_FILETYPE??????????????? : -130
|
23 |
SWFUpload.UPLOAD_ERROR = { |
24 |
???? HTTP_ERROR????????????????????? : -200,
|
25 |
???? MISSING_UPLOAD_URL????????????? : -210,
|
26 |
???? IO_ERROR??????????????????????? : -220,
|
27 |
???? SECURITY_ERROR????????????????? : -230,
|
28 |
???? UPLOAD_LIMIT_EXCEEDED?????????? : -240,
|
29 |
???? UPLOAD_FAILED?????????????????? : -250,
|
30 |
???? SPECIFIED_FILE_ID_NOT_FOUND???? : -260,
|
31 |
???? FILE_VALIDATION_FAILED????????? : -270,
|
32 |
???? FILE_CANCELLED????????????????? : -280,
|
33 |
???? UPLOAD_STOPPED????????????????? : -290
|
37 |
SWFUpload.FILE_STATUS = { |
38 |
???? QUEUED?????? : -1,
|
39 |
???? IN_PROGRESS? : -2,
|
40 |
???? ERROR??????? : -3,
|
41 |
???? COMPLETE???? : -4,
|
46 |
SWFUpload.BUTTON_ACTION = { |
47 |
???? SELECT_FILE? : -100,
|
48 |
???? SELECT_FILES : -110,
|
49 |
???? START_UPLOAD : -120
|
1. 事件处理函数
事件函数 |
触发时间 |
参数 |
swfupload_loaded_handler |
在flash初始化完成之后 |
没有参数 |
file_dialog_start_handler |
当用户点击上传按钮,在打开文件浏览窗口之前 |
没有参数 |
file_queued_handler |
用户成功地选择了文件,在file_dialog_complete_handler事件之前触发。如果选择了多个文件,则触发多次 |
file文件对象 |
file_queue_error_handler |
文件上传数量、类型、大小不符合时 |
file文件对象、错误码、从flash中返回的错误信息 |
file_dialog_complete_handler |
在用户成功了选择了文件后,在所有file_queued_handler之后触发 |
选择文件的数量、加入了文件队列的文件数量、在当前文件队列总共的文件数量 |
upload_start_handler |
用户点击了提交按钮,开始把文件上传到服务器 |
file文件对象 |
upload_progress_handler |
刚打开与服务器的连接与文件上传过程中 |
file文件对象、已经上传的字节数、总共要上传的字节数 |
upload_error_handler |
上传失败时 |
file文件对象、错误码、从flash中返回的错误信息 |
upload_success_handler |
文件上传成功或者等待服务器数据返回超时 |
file文件对象、服务器返回的数据、服务器是否有返回数据 |
upload_complete_handler |
上传完成时,在upload_success_handler之后触发 |
file文件对象 |
debug_handler |
调用SWFUpload对象的debug()函数时 |
swfupload对象和其初始化的参数 |
2. 其他重要参数
参数名 |
意义 |
说明 |
upload_url |
要上传到的服务器地址 |
? |
file_post_name |
上传到服务器中文件内容对应的key |
? |
flash_url |
flash元素的url |
? |
custom_settings |
自定义的参数,可以在事件处理函数中获取得到 |
dict类型 |
button_placeholder_id |
flash的上传按钮显示在html的位置,此名称的元素会被替换成object元素 |
span即可 |
三、上传逻辑
下面是用graphviz画出来的流程图,图比较大,不过看得舒服:) 1. 如上面的示例代码所示,在javascript代码中首先要创建一个SWFUpload的javascript对象,这个对象创建的初始化逻辑如下(箭头表示逻辑和流程的走向):

2. 当javascript将object元素添加到html页面的元素中时,即初始化flash中的元素: 
3.用户点击上传的按钮,准备选择文件时,这个已经绑定了按钮的点击事件,而这个按钮不是input而是一个flash的元素: 
4.用户选择完文件后: 
5. 用户点击提交按钮,文件开始上传到服务器: 
6. 文件上传过程中的一些事件处理逻辑: 
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|