Загрузите несколько файлов в один запрос (jQuery / Python)

Эй, ребята. В принципе, мне нужно создать способ для пользователя открыть веб-страницу, выбрать из списка флажков в форме, и как только форма будет отправлена, загрузите все эти файлы вместе.

Вот ограничения, наложенные на меня клиентом:

  • Платформа – это в первую очередь мобильные устройства
  • Нет zip-файлов (поскольку мы не можем предположить, что мобильное устройство может обрабатывать ZIP-файлы)
  • Файлы ДОЛЖНЫ быть загружены, а не streamовыми

Поэтому я создал веб-приложение с помощью XHTML / CSS w / jQuery Mobile 1.0a3 на интерфейсе и Apache w / Python 2.6 на внутреннем сервере. Целевыми файлами, которые будут загружены, являются файлы .mp3.

Мне удалось добиться желаемого эффекта на рабочем столе, используя скрытые iframes, переданные с сервера и загруженные jQuery через AJAX … но он не работает в браузере Android по умолчанию или в браузере Dolphin.

Я убедился, что мой конфигуратор Apache заставит загружать поведение:

 ForceType application/octet-stream Header set Content-Disposition attachment  

Кроме того, включен модуль заголовков Apache (необходим для параметра конфигурации «Header set»), поэтому это не проблема.

Я делаю вызов AJAX на сервере со всеми выбранными элементами в качестве параметров, и когда сервер читает массив элементов, он будет запрашивать базу данных для информации о каждом элементе (например, URL-адрес каждого mp3-файла). Затем код iframe создается на сервере для каждого mp3-файла, а затем отправляется обратно в функцию $.load() jQuery для загрузки новых фреймов (которые загружают mp3).

Не вставляя слишком много кода, вот очень короткий тестовый пример того, что я делаю:

Серверная сторона

 def download(req): resultDiv = """
""" queryIds = [] for element in req.form: # "element" contains the id number that matches database record trackId = re.match('^track(\d+)', element).group(1) queryIds.append(trackId) conn = MySQLdb.connect(host='localhost', user='fake', passwd='fake', db='fake') cursor = conn.cursor() buildQuery = """\ SELECT filePath FROM tracks WHERE trackNum in (""" buildQuery += ','.join(queryIds) buildQuery += ')' cursor.execute(buildQuery) downloadRows = cursor.fetchall() for track in downloadRows: resultDiv += """ """ % track[0] return resultDiv

Сторона клиента

      .invisible { display: none; }   $(document).ready(function() { $('#albumForm').submit(function(e) { e.preventDefault(); // this will hold the selected items on the form selTracks = {}; $('#trackList').find(':checked').each(function() { selTracks[this.id] = 'on'; }); // load the iframes into a 'div' set aside for that purpose $('#results').load('control.py/download #tracks', selTracks); }); });    

Извините, код настолько общий (и значительно сокращен), но я не уполномочен публиковать фактический код (вы знаете, как это). Но это в основном суть этого; Я считаю, что проблема заключается где-то в интерпретации мобильного браузера или, может быть, в заголовках HTTP где-то? Это РАБОТАЕТ в Chrome и Firefox на рабочем столе, и оно действительно работает точно так, как ожидалось в Fennec для Android (он загружает все файлы без дальнейшего взаимодействия и просто отображает их в панели уведомлений). Я просто не могу предположить, что все используют Fennec (чего они не делают, LOL).

В дополнение к вышесказанному, я пробовал следующее (которое все работало на рабочем столе, но не на мобильном устройстве):

Вот что я пробовал, что не работал ни на рабочем столе, ни на мобильном устройстве:

  • Изменение location.href или window.location (можно сделать это только один раз, очевидно)
  • Вызов req.sendfile() на сервере (возможно, я делаю это неправильно?)
  • Возrotation данных multipart / form и двоичных данных с заданной границей с сервера (ОЧЕНЬ беспорядочно, и, возможно, я тоже делаю это неправильно)

Еще нет радости; Что я могу пропустить?

PS Пожалуйста, не пламени меня за использование скрытых фреймов …

EDIT: Я даже буду в порядке с другим протоколом родного браузера, который я могу настроить на сервере, например FTP. Все идеи приветствуются.

ОБНОВЛЕНИЕ: пытаюсь инициировать FTP-соединение с клиентом на сервере и запускать «mget». Я знаю, что net2ftp может это сделать … теперь, чтобы понять это;) Все еще новые идеи.

Это клиентский лимит. Существует ограничение на параллельную загрузку для каждого домена. Попробуйте использовать файлы из разных доменов, скажем, d1.example.com и d2.example.com. Все они могут обслуживаться с одного и того же виртуального хоста:

  ServerName example.com ServerAlias d1.example.com d2.example.com ...