Загрузка нескольких файлов без использования Zip-файла

У меня есть общий обработчик Document.ashx который создает документы Word «на лету», читая информацию из запроса, такого как Document.ashx?clientid=123&documentid=10 и он отлично работает.

Мне нужно создать интерфейс со списком флажков и кнопкой « Download All . Лучшая идея, которую я использовал до сих пор, – это использовать что-то подобное, чтобы вызвать вызовы обработчику.

 $("body").append(" ") 

Chrome и Firefox обрабатывают это, как ожидалось, хотя IE9 предлагает пользователю спросить, хотите ли они сохранить первый файл, но игнорирует следующие файлы.

Как начать загрузку нескольких файлов с клиента?

Это для сайта интрасети, поэтому файлы всегда генерируются через ~ 1 секунду, пользователи будут выбирать ~ 3-5 документов за раз. Подавляющее большинство пользователей используют IE9. Я могу сказать всем, что им нужно использовать Firefox или Chrome, но я бы скорее нашел решение, которое работает во всех современных браузерах.

Я не хочу создавать серверный сервер zip-файлов, потому что тогда они всегда должны разархивировать его сначала (что будет слишком сложно для понимания некоторыми), и это замедляет их.

Таким образом, это возможно overkill, но работает в IE9, FF7 и Chrome 16:

Вдохновленный этим сообщением SO

Плагины jQuery:

  • json2.js
  • $ .cookie ()
  • $ .bbq ()

C # в обработчике:

 public void ProcessRequest (HttpContext context) { ... if (!string.IsNullOrEmpty(context.Request.QueryString["downloadid"])) Response.Cookies[context.Request.QueryString["downloadid"]].Value = "complete"; } 

Javascript / JQuery:

 function downloadFile(url, downloadid) { //set a cookie with a unique download id $.cookie(downloadid, 'pending', { path: '/' }); //create a new url var newurl = $.param.querystring(url, { downloadid: downloadid }); //append an iframe with new url $("body").append(""); } function downloadComplete(downloadid) { //check if download is pending return $.cookie(downloadid) == "complete"; } function downloadManager(arrDownloads) { //loop through download items backwards var allComplete = false; for (var i = arrDownloads.length; i > 0; i--) { if (downloadComplete(arrDownloads[i - 1].downloadid)) { //download the next one if it exists if (i == arrDownloads.length) { allComplete = true; } else { downloadFile(arrDownloads[i].url, arrDownloads[i].downloadid); } //stop checking for completed downloads break; } } if (allComplete) { //remove cookies for (var i = arrDownloads.length; i > 0; i--) { $.cookie(arrDownloads[i - 1].downloadid, null, { path: '/' }); } //remove iframes $("iframe[data-downloadid]").remove(); } else { setTimeout("downloadManager(" + JSON.stringify(arrDownloads) + ");", 500); } } function downloadFiles(arrurls) { var arrDownloads = []; for (var i = 0; i < arrurls.length; i++) { var item = new Object(); item.url = arrurls[i]; item.downloadid = newGuid(); arrDownloads.push(item); } //start the first download downloadFile(arrDownloads[0].url, arrDownloads[0].downloadid); //initiate the manager downloadManager(arrDownloads); } $(function () { var arrurls = []; arrurls.push("Document.ashx?clientid=123&documentid=10"); arrurls.push("Document.ashx?clientid=123&documentid=11"); arrurls.push("Document.ashx?clientid=123&documentid=12"); arrurls.push("Document.ashx?clientid=123&documentid=13"); arrurls.push("Document.ashx?clientid=123&documentid=14"); downloadFiles(arrurls); }); 

Плагин jQuery, который будет работать для вас:

github.com/biesiad/multiDownload

Это может или не может решить вашу проблему, но вы делаете общую ошибку здесь. Ифрагмы не являются самозакрывающимися тегами. Многие браузеры не будут правильно разбирать этот html. Попробуйте сделать это

 $("body").append(" ") 

Кроме того, вы хотите попробовать добавить каждый iframe самостоятельно, поскольку браузеры могут не правильно распознавать фреймы при добавлении сразу:

 $("body").append(""); $("body").append(""); 

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

 Protected Sub DownloadFile(fileId As String) If Request.Browser.Browser = "Chrome" Then 'open iframes dynamically for multiple downloads ClientScript.RegisterStartupScript(Me.GetType(), fileId, _ "") Else 'open windows for multiple downloads ClientScript.RegisterStartupScript(Me.GetType(), fileId, _ "") End If End Sub 

Вот функции javascript:

 function openWindowForDownloadHandler(fileId) { //open a new window. setting height and width foces new window as opposed to new tab window.open('FileShareDownloadHandler.ashx?id=' + fileId, '_blank', 'width=100,height=100,left=0,top=0'); } function createIframeForDownloadHandler(fileId) { var element = document.createElement("iframe"); element.setAttribute('id', 'myframe' + fileId); element.setAttribute('style', 'display:none;'); element.setAttribute('src', 'FileShareDownloadHandler.ashx?id=' + fileId); document.body.appendChild(element); } 

Помещение DownloadFile (id) внутри цикла работает хорошо.

В принципе, я нашел, что хром хорошо работает с обработкой iFrames, но IE не работает (я использую IE9). Это работает для меня на Crome v26, FF v19, IE9.

Вы можете позвонить для загрузки в цикле javascript следующим образом:

 Download All  
  • Как обрабатывать запрос Ajax JQUERY POST с помощью WCF-хоста
  • отложенная функция addclass / remove не работает
  • Добавьте разделитель тысяч в число с Javascript или jQuery?
  • Отображать содержимое XML на странице HTML
  • Где fn.toggle (обработчик (eventObject), обработчик (eventObject) ...) ушел?
  • Следует ли заменить использование addJSONData jqGrid на использование setGridParam () и trigger ('reloadGrid')?
  • Номер строки таблицы и столбца в jQuery
  • Изменение CSS-элемента дочернего элемента при зависании родительского элемента
  • Слушайте изменения в DIV и действуйте соответственно
  • : nth-of-type () в jQuery / Sizzle?
  • Как сделать выпадающий список только с использованием jquery?
  • Давайте будем гением компьютера.