黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

swfupload淺析

系統(tǒng) 2783 0

一、簡介和示例

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這個上傳庫是可以顯示上傳進度以及上傳速度等上傳信息。一般實現(xiàn)這種上傳體驗有2種方式,一種是異步上傳,在服務器端邊接收數(shù)據(jù)邊往session寫入接收的字節(jié)數(shù)和進度數(shù)據(jù),然后客戶端輪詢這個記錄在session的進度數(shù)據(jù)并回顯到頁面。第二種方式就是采用flash來上傳,也就是swfupload所采用的方式,在發(fā)送過程中將發(fā)送的相關狀態(tài)數(shù)據(jù)回傳到js的函數(shù)中處理。

下面是一個單個 文件上傳 的使用示例,簡單的創(chuàng)建一個SWFUpload對象,并傳入相關的事件處理和參數(shù)就可以了:

01 ???????? var swfu;
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,
15 ? ?
16 ???????????????? file_dialog_start_handler: fileDialogStart,
17 ???????????????? file_queued_handler : fileQueued,
18 ???????????????? file_queue_error_handler : fileQueueError,
19 ???????????????? file_dialog_complete_handler : fileDialogComplete,
20 ? ?
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,
31 ? ?
32 ???????????????? // Flash Settings
33 ???????????????? flash_url : "/static/swf/swfupload.swf" ,
34 ???????????????? custom_settings : {
35 ???????????????????? progress_target : "fsUploadProgress" ,
36 ???????????????????? upload_successful : false
37 ???????????????? },
38 }

?

二、參數(shù)說明

原理是很明顯易懂的,關鍵是flash和javascript的通訊部分,在 文件上傳 的各個狀態(tài)都會有javascript和flash函數(shù)的相互回調(diào)。目前主要研究了上傳單個文件的上傳邏輯,swfupload支持多個 文件上傳 的,不過核心的邏輯應該是沒有太多的變化。swfupload用一個隊列來管理多個 文件上傳 的,因為在傳入的參數(shù)中會有一些隊列和 文件上傳 數(shù)量相關的參數(shù)。

在其核心的JavaScript文件swfupload.js定義的狀態(tài)碼以及從flash傳遞到js的文件對象:

01 //文件對象
02 file = {
03 ???? "id" :SWFUpload_0_0,
04 ???? "index" :0,
05 ???? "filestatus" :-1,
06 ???? "name" :vim-cheat-sheet-diagram.png,
07 ???? "size" :317949,
08 ???? "type" : "" ,
09 ???? "creationdate" :Fri Jan 16 1970 00:08:13 GMT+0800 (CST),
10 ???? "modficationdate" :Fri Jan 16 1970 00:08:13 GMT+0800 (CST),
11 ???? "post" : {}
12 }
13 ? ?
14 //文件隊列錯誤碼
15 SWFUpload.QUEUE_ERROR = {
16 ???? QUEUE_LIMIT_EXCEEDED??????????? : -100,
17 ???? FILE_EXCEEDS_SIZE_LIMIT???????? : -110,
18 ???? ZERO_BYTE_FILE????????????????? : -120,
19 ???? INVALID_FILETYPE??????????????? : -130
20 };
21 ? ?
22 //上傳錯誤碼
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
34 };
35 ? ?
36 //文件狀態(tài)
37 SWFUpload.FILE_STATUS = {
38 ???? QUEUED?????? : -1,
39 ???? IN_PROGRESS? : -2,
40 ???? ERROR??????? : -3,
41 ???? COMPLETE???? : -4,
42 ???? CANCELLED??? : -5
43 };
44 ? ?
45 //按鈕的動作
46 SWFUpload.BUTTON_ACTION = {
47 ???? SELECT_FILE? : -100,
48 ???? SELECT_FILES : -110,
49 ???? START_UPLOAD : -120
50 };

1. 事件處理函數(shù)

事件函數(shù) 觸發(fā)時間 參數(shù)
swfupload_loaded_handler 在flash初始化完成之后 沒有參數(shù)
file_dialog_start_handler 當用戶點擊上傳按鈕,在打開文件瀏覽窗口之前 沒有參數(shù)
file_queued_handler 用戶成功地選擇了文件,在file_dialog_complete_handler事件之前觸發(fā)。如果選擇了多個文件,則觸發(fā)多次 file文件對象
file_queue_error_handler 文件上傳 數(shù)量、類型、大小不符合時 file文件對象、錯誤碼、從flash中返回的錯誤信息
file_dialog_complete_handler 在用戶成功了選擇了文件后,在所有file_queued_handler之后觸發(fā) 選擇文件的數(shù)量、加入了文件隊列的文件數(shù)量、在當前文件隊列總共的文件數(shù)量
upload_start_handler 用戶點擊了提交按鈕,開始把 文件上傳 到服務器 file文件對象
upload_progress_handler 剛打開與服務器的連接與 文件上傳 過程中 file文件對象、已經(jīng)上傳的字節(jié)數(shù)、總共要上傳的字節(jié)數(shù)
upload_error_handler 上傳失敗時 file文件對象、錯誤碼、從flash中返回的錯誤信息
upload_success_handler 文件上傳 成功或者等待服務器數(shù)據(jù)返回超時 file文件對象、服務器返回的數(shù)據(jù)、服務器是否有返回數(shù)據(jù)
upload_complete_handler 上傳完成時,在upload_success_handler之后觸發(fā) file文件對象
debug_handler 調(diào)用SWFUpload對象的debug()函數(shù)時 swfupload對象和其初始化的參數(shù)

2. 其他重要參數(shù)

參數(shù)名 意義 說明
upload_url 要上傳到的服務器地址 ?
file_post_name 上傳到服務器中文件內(nèi)容對應的key ?
flash_url flash元素的url ?
custom_settings 自定義的參數(shù),可以在事件處理函數(shù)中獲取得到 dict類型
button_placeholder_id flash的上傳按鈕顯示在html的位置,此名稱的元素會被替換成object元素 span即可

三、上傳邏輯

下面是用graphviz畫出來的流程圖,圖比較大,不過看得舒服:)
1. 如上面的示例代碼所示,在javascript代碼中首先要創(chuàng)建一個SWFUpload的javascript對象,這個對象創(chuàng)建的初始化邏輯如下(箭頭表示邏輯和流程的走向):

2. 當javascript將object元素添加到html頁面的元素中時,即初始化flash中的元素:

3.用戶點擊上傳的按鈕,準備選擇文件時,這個已經(jīng)綁定了按鈕的點擊事件,而這個按鈕不是input而是一個flash的元素:

4.用戶選擇完文件后:

5. 用戶點擊提交按鈕,文件開始上傳到服務器:

6. 文件上傳 過程中的一些事件處理邏輯:

Filed under: Web

swfupload淺析


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論