2010-02-27 161 views
6

有沒有辦法排隊文件上傳,而不訴諸於Flash或Silverlight,只是使用巧妙使用的形式和JavaScript?請注意,上傳應該異步執行。排隊異步HTTP文件上傳

通過「排隊」上傳我的意思是,如果用戶試圖上傳多個文件,則不應該在單個HTTP連接中同時傳輸它們,而應該一次傳輸一個文件。

+0

它是否必須是一個HTTP連接? –

+0

是的。這是我的問題點。 – dpq

+0

問題:如果你提交一個包含多個文件的表單,它們是同時發送還是一個接一個發送? –

回答

2

由於規範的限制,我不認爲可以在單個HTTP連接上執行此操作。 但是,通過將<input>字段放在單獨的表單中(無論是HTML還是JavaScript)並按順序提交它們,您可能會獲得幾乎相同的行爲。

將它們的目標放置在上,並使用iframe.onload事件觸發列表中的下一個表單。

其他備註:

  • 參考靶向內部框架參見this。請注意,此功能在HTML/XHTML Strict中不受支持。
  • form.target屬性必須等於iframe.name屬性。 iframe.id將不起作用;它會在IE6和FF3.5中產生一個彈出窗口。
  • 可以使用定位上傳「全部一次性」的工作示例here。我已經清理了這個例子並使用了它。它適用於IE6以及任何一流的瀏覽器。
+0

讓我知道它是否適合你。我曾想過嘗試像這樣的事情,但沒有時間。 – Kivin

1

我以前見過的一個選項,雖然我沒有鏈接或示例,但使用的是iframe。基本上,這些文件被提交給iframe和JavaScript手錶,以查看該iframe何時重新加載,然後提交下一個。這不是很好,我想我嘗試過,但無法跨瀏覽器使用它(當時我需要它,包括IE6)。

+0

好的,謝謝。我會盡力實施它。你還記得你遇到過哪些瀏覽器嗎? – dpq

+0

我相信最困難的一個是IE6以及其他IE,但我認爲7&8是沒問題的。這是一段時間,我已經刪除了所有的測試代碼,因爲我可以使用Flash,因爲它已經在網站上的其他地方使用過了。 –

2

我有良好的權威Uploadify是非常好的。而且,它本身支持隊列。一個簡單的例子,假設您已經創建了一個ID爲「foo」的表單「file」元素和一個用作ID爲「queue」的隊列的元素。有關更多信息,請參閱docs

$("foo").uploadify({ 
    'uploader' : 'uploadify.swf', 
    'script' : 'uploadify.php', 
    'cancelImg' : 'cancel.png', 
    'auto'  : true, 
    'folder' : '/uploads', 
    'queue'  : "queue" 
}); 
+0

Uploadify需要Flash,而我正在尋找一種不支持的解決方案。 – dpq

+0

哦,對。對不起,我完全忘記了這個要求。出於好奇,爲什麼你想避免閃光? Uploadify不需要與Flash進行任何交互,它爲您打包。 – Benson

+0

由於相關網絡應用程序的具體情況,其銷售點之一是它根本不需要插件來完成任何實際工作。由於上傳文件是一項非常重要的任務,我寧願避免依賴Flash。 – dpq

0

廣義看着它,什麼需要做:

  • 函數動態與輸入類型爲文件添加形式(以HTML)。一個表單將只有一個文件輸入字段。這些表單將成爲我們的文件上傳隊列。
  • 提交函數將提交這些表單異步接連不斷。

這是我現在可以考慮的簡單邏輯[當我回家時必須編碼]。

0

有asyncronysly上傳文件使用XMLHttpRequest的一個簡單efficent方式:指https://developer.mozilla.org/en/using_xmlhttprequest了「在Firefox 3.5及更高版本」部分。有了這個,你可以上傳文件asyncronysly獲得進度百分比的上傳。隨着Firefox 3.6和更高版本,你也可以異步上傳多個文件。我以更簡單的方式製作js函數,完成後我會發布它。

0

最近我寫了一個jQuery插件,可以讓你做這樣的事情。我無法發佈代碼,但我可以描述它是如何工作的。如果沒有意義,讓我知道,因爲它已經有一段時間了。有一組上傳表單元素。當一個文件被選中時,它會發布到一個隱藏的iFrame中,其內容(通過base64)被複制到一個隱藏的表單域中。然後,當提交最終表單時,隱藏表單域的內容將用於獲取文件信息。

Erick