SWFUpload的原理:

利用Flash选择文件后上传,通过Flash和JS交互,对整个过程进行控制——包括页面的DOM操作之类的,都可以通过JS来进行控制。

说白了,就是用Flash上传,JS操作DOM

使用时首先必须要初始化

var swfObject,paramsObject; 

window.onload = function(){ swfObject = new SWFUpload(paramsObject); }

这个初始化做了很多事情,包括对SWFUpload生成的实例的参数等等。

所有的参数设置都在那个paramsObject参数中。 paramsObject其实是一个JSON格式的对象,该对象有一些属性。

upload_url:   文件上传的处理程序,就是说,你要在这个文件对上传这个动作进行定义,比如文件保存、重命名之类的,如果这个没有具体动作的话,文件不会在服务器上有任何踪迹(根本就不是FILE格式传递的。)

flash_url : 上传的Flash,用SWFUpload默认的就可以。具体位置具体解决。 

file_post_name : 这个和upload_url有关系。这个设置后,在upload_url路径中,就可以用Request("Filedata")来获取上传的文件相关信息了。

file_types : "*.jpg;*.gif", //允许上传文件类型

file_types_description: 选取文件时的描述

file_size_limit : "1024", //可以上传文件的最大尺寸,单位可以是B、KB、MB、GB,如果没有单位,则默认是KB

file_upload_limit :最大可以上传文件数量 0为不限制

file_queue_limit :上传队列等待文件数的最大值

debug : false //是否调试模式

prevent_swf_caching : false,//在相关的swf文件增加随机参数以避免Flash被缓存(建议打开,Flash被缓存已经导致太多问题了) 

button_placeholder_id : "element_id", //Flash选择文件按钮的id,相应的DOM的ID元素会被替换成Flash上传按钮

button_p_w_picpath_url : //Flash上传按钮的图片

button_width:

button_height:

button_text : 

button_text_style:

button_text_left_padding:

button_text_top_padding:

button_action : SWFUpload.BUTTON_ACTION.SELECT_FILES 可以多选文件/ SWFUplaod.BUTTON_ACTION.SELECT_FILE 不可以多选文件

button_disable :false//按钮是否不可用

button_cursor : SWFUpload.BUTTON_CURSOR.HAND //鼠标划过Flash按钮显示的光标状态 

button_window_mode : SWFUpload.WINDOW_MODE.TRANSPARENT

swfupload_loaded_handler : swfupload_loaded_function, //Flash按钮被加载好的时候执行的操作,可以为空。 

file_dialog_start_handler : file_dialog_start_function, //打开文件选择选择窗口时触发的事件,默认方法fileDialogStart,可根据需要重载方法

file_queued_handler : file_queued_function, //文件成功选择后触发的事件,默认方法fileQueued(fileObject),可根据需要重载方法

file_queue_error_handler : file_queue_error_function, //文件选择失败后触发事件(类型不对、大小不对等等),默认方法fileQueueError(fileObject,errorcode,message),可根据需要重载方法

file_dialog_complete_handler : file_dialog_complete_function,//文件选择窗口关闭时触发事件,默认方法fileDialogComplete(number of selected files,number of queued files),可根据需要重载方法

upload_start_handler : upload_start_function, //上传开始时触发事件,默认方法uploadStart(fileObject),可根据需要重载方法

upload_progress_handler : upload_progress_function, //文件上传过程中触发事件,默认方法uploadProgress(fileObject,bytes complete,bytes all),可根据需要重载方法 

upload_error_handler : upload_error_function, //文件传输过程中出错触发事件,默认方法uploadError(fileObject,error code,message),可根据需要重载方法 

upload_success_handler : upload_success_function,//文件传输完成(仅仅是发送,不管服务器是否操作),默认方法uploadSuccess(fileObject,serverdata),可根据需要重载方法。其中serverdata表示服务器upload_url返回的信息(Window服务器需要返回一个非空值,否则success和complete都不执行)

upload_complete_handler : upload_complete_function, //一个文件上传周期完成时触发(不管是否上传成功还是失败,都会触发) debug_handler : debug_function, //调试模式打开的时候,在页面的textArea中添加debug信息供调用。默认SWFUpload已经定义了debug(message)方法调用,如有需要复写覆盖掉。

custom_settings : { custom_setting_1 : "custom_setting_value_1", custom_setting_2 : "custom_setting_value_2", custom_setting_n : "custom_setting_value_n", } }//定义的变量主要是供各个handler函数使用。

 PS:参数中的各个函数,都算是SWFUpload这个类的的成员函数。调用SWFUpload的其他函数就可以直接用this.xxx()来调用。如果不是上述参数中的函数,需要调用SWFUpload的函数,比如上传开始的startUpload()。如果你是在fileQueued函数中要上传,那么只需要执行this.startUpload()就可以了。如果你想在点击Submit的时候进行上传,那么这个时候周期就不在SWFUpload执行中了(不属于上述任何一个handler),这时你要想上传就应该是指明某个SWFUpload的实例,比如本篇应该是swfObject.startUpload();(具体理解成类就好了,一个是在类的内部调用,一种是类的外部调用)

upload_success_handler:uploadSuccess SWFUpload的提交过程与表单无关,所以我们需要手动设置SWFUpload的对象进行startUpload();——这个方法是已经初始化的SWFUpload对象具有的方法。操作才行。通常情况下,我们可以在表单的submit按钮上面添加一个 在整个过程中,上传和表单提交是两个完全不同的过程执行的操作(如果你把startUpload方法绑定到表单提交过程中的话,感觉是一个过程,但是本质上还是两个过程——文件上传(包括对表单的部分hidden域进行赋值)和表单提交两个过程。) 所以我有个想法,干脆在file_queued_handler过程中就直接上传,也就是触发startUpload()方法,并且在upload_success_handler事件中对隐藏域(hidden)赋值,一方面省去了最后一次性提交的麻烦,另一方面也较少了系统响应时间(表单还是有一些时间填写)。