2010-02-27 2 views
6

Есть ли способ загружать файлы в очередь, не прибегая к Flash или Silverlight, только с искусно используемыми формами и JavaScript? Обратите внимание, что загрузка должна выполняться асинхронно.Queuing asynchronous HTTP file uploads

Под загрузкой «очереди» я имею в виду, что если пользователь пытается загрузить несколько файлов, они не должны передаваться одновременно, а по одному в одном 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 очень хорош. Кроме того, он поддерживает очереди изначально. Простой пример, предполагающий, что вы уже создали элемент формы «file» с идентификатором «foo» и элементом, который будет использоваться в качестве очереди с идентификатором «queue». См. docs для получения дополнительной информации.

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

Для загрузки требуется Flash, в то время как я ищу решение, которое этого не делает. – dpq

+0

О, право. Извините, я полностью забыл об этом требовании. Из любопытства, почему вы хотите избежать вспышки? Uploadify не требует никакого взаимодействия со вспышкой, она завершает его для вас. – Benson

+0

Из-за специфики рассматриваемого веб-приложения один из его пунктов продажи заключается в том, что он не требует плагинов для любой реальной работы вообще. Поскольку загрузка файлов является довольно важной задачей, я бы предпочел избежать зависимости от Flash. – dpq

0

В широком смысле, глядя на него, что должно быть сделано:

  • Функция динамического добавления форм (в формате HTML) с входным типа, как файл. В одной форме будет только одно поле ввода файла. Эти формы будут нашей очередью загрузки файлов.
  • Функция отправки, которая будет представлять эти формы один за другим асинхронно.

Это простая логика, о которой я могу думать сейчас [нужно указывать, когда я вернусь домой].

0

Существует простой ЭФФЕКТИВНЫЙ способ загрузки файлов asyncronysly с XMLHttpRequest: см https://developer.mozilla.org/en/using_xmlhttprequest в разделе «В Firefox 3.5 и более поздних версиях». С помощью этого вы можете загружать файлы asyncronysly, получая также процент выполнения загрузки. С firefox 3.6 и более поздними версиями вы также можете загружать асинхронно несколько файлов. Я делаю функцию js для выполнения более простым способом, когда закончу, я опубликую ее.

0

В недавнем прошлом я написал плагин jQuery, который позволит вам сделать что-то подобное. Я не могу опубликовать код, но я могу описать, как он работает. Если это не имеет смысла, дайте мне знать, как это было давно.

Был набор элементов формы для загрузки. Когда файл был выбран, он отправил бы скрытый iFrame, содержимое (через base64) которого было скопировано в скрытое поле формы. Затем, когда отправляется окончательная форма, содержимое скрытых полей формы используется для получения информации о файле.

Erick