解決jQuery uploadify在非IE核心瀏覽器下無法上傳

一、jquery uploadify自我介紹:
(1)、大家好,我是jquery插件大家族中負責實現異步上傳的插件,我不是唯一 , 只是較好用的一款 。
(2)、我的功能:
支持單文件或多文件上傳,可控制并發上傳的文件數
在服務器端支持各種語言與之配合使用,諸如PHP,.NET,Java……
通過參數可配置上傳文件類型及大小限制
【解決jQuery uploadify在非IE核心瀏覽器下無法上傳】通過參數可配置是否選擇文件后自動上傳
易于擴展,可控制每一步驟的回調函數(onSelect, onCancel……)
通過接口參數和CSS控制外觀
(3)、我的用法:
去baidu.com,google.com search search,很多 。
二、firefox下我出故障了,是我的問題嗎?
jquery uploadify在ie下可以正常上傳,在實現異步上傳的時候,每一個文件在上傳時都會提交給服務器一個請求 。每個請求都需要安全驗證,session和cookie的校驗 。是的,就是這樣 。由于jquery uploadify是借助flash來實現上傳的,每一次向后臺發送數據流請求時,ie會自動把本地cookie存儲捆綁在一起發送給服務器 。但firefox、chrome不會這樣做,他們會認為這樣不安全 。哈 , 這就是原因 。
找到原因了,在讓我們來明白兩個概念:
(1)、session:
Session又稱為會話狀態,是Web系統中最常用的狀態,用于維護和當前瀏覽器實例相關的一些信息 。舉個例子來說,我們可以把已登錄用戶的用戶名放在Session中,這樣就能通過判斷Session中的某個Key來判斷用戶是否登錄 , 如果登錄的話用戶名又是多少 。
我們知道,Session對于每一個客戶端(或者說瀏覽器實例)是“人手一份”,用戶首次與Web服務器建立連接的時候,服務器會給用戶分發一個 SessionID作為標識 。SessionID是一個由24個字符組成的隨機字符串 。用戶每次提交頁面,瀏覽器都會把這個SessionID包含在 HTTP頭中提交給Web服務器 , 這樣Web服務器就能區分當前請求頁面的是哪一個客戶端 。那么,ASP.NET 2.0提供了哪些存儲SessionID的模式呢!
(2)、Cookie,有時也用其復數形式Cookies , 指某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密) 。
三、解決方案
1.asp.net環境下
在Global.asax文件中,編寫如下代碼:

解決jQuery uploadify在非IE核心瀏覽器下無法上傳

Aspx頁面端代碼
解決jQuery uploadify在非IE核心瀏覽器下無法上傳

把session值及身份驗證值保存到客戶端控件中,然后你就可以通過js獲取這兩個值 , 然后傳給下面的插件js初始化程序 。
(之所以選擇將session值放入到控件中存儲,也是怕客戶端禁用cookie的考慮 。)
以下是js代碼
解決jQuery uploadify在非IE核心瀏覽器下無法上傳

在插件初始化的時候,把本地記錄下來的session值,以及身份驗證值傳給初始化方法,進行參數賦值,這樣 , 每次異步請求上傳文件的時候,相應的 session值就包含在請求文件中了 。
2.C#環境下
以上是asp.net下的解決方法,那么C#中應該如何處理呢?
我是這樣解決的,這樣所有上傳文件的代碼都不需要修改 , 改動量最小 , 但是有安全隱患:
解決jQuery uploadify在非IE核心瀏覽器下無法上傳

我們的系統是ASP.NET MVC的,雖說通過加密的方式可以讓用戶看不到敏感信息,但惡意用戶不需要把敏感信息解密出來就可繞過系統驗證 。
驗證信息不能直接寫前臺 , 可以用ajax從后臺獲取驗證信息,然后傳給flash,然后在攔截器中驗證 。
修改后:
JS代碼:
ajax請求后臺獲取用戶名,傳給flash
解決jQuery uploadify在非IE核心瀏覽器下無法上傳

攔截器中代碼:
解決jQuery uploadify在非IE核心瀏覽器下無法上傳

3.jsp版解決方法
解決jQuery uploadify在非IE核心瀏覽器下無法上傳


解決jQuery uploadify在非IE核心瀏覽器下無法上傳

總結
簡單的說 , 最終的解決辦法就是可以在每個引用的文件后面加個隨機數,讓它每次請求都帶個參數,該問題則自動解決 。

相關經驗推薦