Pobierz Wiele Plików Bez Użycia Pliku Zip
Mam ogólny handler Document.ashx
, który tworzy dokumenty Worda w locie, czytając informacje z querystring w ten sposób Document.ashx?clientid=123&documentid=10
i działa idealnie.
Muszę stworzyć interfejs z listą checkboxów i przyciskiem Download All
. Najlepszy pomysł, jaki miałem do tej pory, to użycie czegoś takiego do rozmów z opiekunem.
$("body").append("<iframe src='Document.ashx?clientid=123&documentid=10'></iframe>
<iframe src='Document.ashx?clientid=123&documentid=11'></iframe>")
Chrome i Firefox obsługują to zgodnie z oczekiwaniami, chociaż IE9 pyta użytkownika, czy chce zapisać pierwszy plik, ale ignoruje następujące pliki.
Jak rozpocząć pobieranie wielu plików od klienta?
Jest to dla witryny intranetowej, więc pliki są zawsze generowane w ~1 sekundę, użytkownicy będą wybierać ~3-5 dokumentów na raz. Zdecydowana większość użytkowników korzysta z IE9. Mogę powiedzieć wszystkim, że muszą używać Firefoksa lub Chrome, ale wolałbym znaleźć rozwiązanie, które działa we wszystkich nowoczesnych przeglądarkach.
Nie chcę tworzyć po stronie serwera plików zip, bo wtedy zawsze muszą go rozpakować po pierwsze (co dla niektórych będzie zbyt trudne do zrozumienia) i spowalnia ich.
5 answers
Więc jest to prawdopodobnie przesada, ale działa w IE9, FF7 i Chrome 16:
Inspired by this SO post
JQuery Plugins:
C # in handler:
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("<iframe style='height:0;width:0;' data-downloadid='" + downloadid + "' src='" + newurl + "'></iframe>");
}
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);
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:26
JQuery plugin, który wykona pracę za Ciebie:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-29 06:04:48
To może rozwiązać twój problem, ale popełniasz częsty błąd. Ramki Iframes nie są znacznikami samoczynnie zamykającymi się. Wiele przeglądarek nie będzie poprawnie analizować tego html. Spróbuj zrobić to
$("body").append("<iframe src='Document.ashx?clientid=123&documentid=10'>If you can read this, please use a newer browser</iframe>
<iframe src='Document.ashx?clientid=123&documentid=11'>If you can read this, please use a newer browser</iframe>")
Możesz również spróbować dodać każdą ramkę iframe niezależnie, ponieważ przeglądarki mogą nie rozpoznawać ramek poprawnie po dodaniu wszystkich naraz:
$("body").append("<iframe src='Document.ashx?clientid=123&documentid=10'>If you can read this, please use a newer browser</iframe>");
$("body").append("<iframe src='Document.ashx?clientid=123&documentid=10'>If you can read this, please use a newer browser</iframe>");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-28 19:08:33
Wiem, że to stare pytanie, ale ostatnio miałem ten problem i stworzyłem takie rozwiązanie, które najlepiej odpowiadało moim potrzebom(nie chciałem używać żadnych ciasteczek i chciałem, aby Kod był jak najprostszy). W kodzie za:
Protected Sub DownloadFile(fileId As String)
If Request.Browser.Browser = "Chrome" Then
'open iframes dynamically for multiple downloads
ClientScript.RegisterStartupScript(Me.GetType(), fileId, _
"<script language='javascript'>createIframeForDownloadHandler('" & fileId & "');</script>")
Else
'open windows for multiple downloads
ClientScript.RegisterStartupScript(Me.GetType(), fileId, _
"<script language='javascript'>openWindowForDownloadHandler('" & fileId & "');</script>")
End If
End Sub
Oto funkcje 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);
}
Umieszczenie pliku DownloadFile (id) wewnątrz pętli działa dobrze.
Zasadniczo, znalazłem chrome działa dobrze z obsługą iFrames, ale IE nie (używam IE9). To działa na mnie na Crome v26, FF v19, IE9.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-25 15:30:47
Możesz wywołać, aby pobrać w pętli javascript, jak to:
<a id="downloadAll" href="#">Download All</a>
<script>
var downloadSelected = $('a#downloadSelected');
var doc_ids = ['10', '11'];
for (var i in doc_ids) {
var uri = 'Document.ashx?clientid=123&documentid=' + doc_ids[i];
var iframe = $("<iframe/>").attr({
src: uri,
style: "visibility:hidden;display:none"
}).appendTo(downloadAll);
}
</script>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-12 05:05:12