Загрузка нескольких файлов без использования Zip-файла
У меня есть общий обработчик Document.ashx
который создает документы Word «на лету», читая информацию из запроса, такого как Document.ashx?clientid=123&documentid=10
и он отлично работает.
Мне нужно создать интерфейс со списком флажков и кнопкой « Download All
. Лучшая идея, которую я использовал до сих пор, – это использовать что-то подобное, чтобы вызвать вызовы обработчику.
$("body").append(" ")
Chrome и Firefox обрабатывают это, как ожидалось, хотя IE9 предлагает пользователю спросить, хотите ли они сохранить первый файл, но игнорирует следующие файлы.
- Сообщение jQuery для Rails
- Как использовать переменную для ключа в литерале объекта JavaScript?
- Ошибка «Нет транспорта» w / jQuery ajax-вызов в IE
- jQuery bind click * НИЧЕГО * но * ELEMENT *
- JQuery Проверять несколько полей с одной ошибкой
Как начать загрузку нескольких файлов с клиента?
Это для сайта интрасети, поэтому файлы всегда генерируются через ~ 1 секунду, пользователи будут выбирать ~ 3-5 документов за раз. Подавляющее большинство пользователей используют IE9. Я могу сказать всем, что им нужно использовать Firefox или Chrome, но я бы скорее нашел решение, которое работает во всех современных браузерах.
Я не хочу создавать серверный сервер zip-файлов, потому что тогда они всегда должны разархивировать его сначала (что будет слишком сложно для понимания некоторыми), и это замедляет их.
- Поле ввода ввода JQuery
- Использовать requirejs и jquery, не сбивая глобальный jquery?
- jQuery `.is (": visible ")` не работает в Chrome
- JQuery Ajax Проводка json для webservice
- использовать jQuery's find () для объекта JSON
- Динамическое добавление складных элементов
- Twitter Bootstrap Используйте collapse.js на ячейках таблицы
- Автозаполнение jQuery для динамически создаваемых входов
Таким образом, это возможно 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