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.

Author: Greg, 2012-01-28

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);
});
 10
Author: Greg,
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:

Github.com/biesiad/multiDownload

 5
Author: biesiad,
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>");
 0
Author: Ben D,
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.

 0
Author: Taylor Brown,
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>
 0
Author: Joe Cheng,
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