Скачать несколько файлов без использования Zip файла - PullRequest
11 голосов
/ 28 января 2012

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

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

$("body").append("<iframe src='Document.ashx?clientid=123&documentid=10'></iframe>
                  <iframe src='Document.ashx?clientid=123&documentid=11'></iframe>")

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

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

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

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

Ответы [ 5 ]

10 голосов
/ 29 января 2012

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

Вдохновленный этим постом

jQuery плагины:

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("<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);
});
5 голосов
/ 19 июля 2012

плагин jQuery, который сделает всю работу за вас:

github.com / biesiad / multiDownload

0 голосов
/ 12 декабря 2016

Вы можете позвонить, чтобы загрузить в цикле JavaScript, как это:

<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 голосов
/ 25 апреля 2013

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

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

Вот функции 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) внутри цикла работает хорошо.

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

0 голосов
/ 28 января 2012

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

$("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>")

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

$("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>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...