Как скачать несколько файлов за один снимок в IE - PullRequest
8 голосов
/ 18 марта 2011

Я хочу загрузить несколько файлов одним нажатием кнопки в jsp.
Я использую следующий код в js для вызова одного сервлета дважды.

var iframe = document.createElement("iframe");
iframe.width = iframe.height = iframe.frameBorder = 0;
iframe.scrolling = "no";
iframe.src = "/xyz.jsp?prodId=p10245";
document.getElementById("iframe_holder").appendChild(iframe);

var iframe2 = document.createElement("iframe");
iframe2.width = iframe2.height = iframe2.frameBorder = 0;
iframe2.scrolling = "no";
iframe2.src = "/xyz.jsp?prodId=p10243";
document.getElementById("iframe_holder").appendChild(iframe2);

В xyz.jsp я являюсьвызов сервлета, который скачивает файл с пути и отправляет его в браузер.
Проблема в том, что он работает в Safari, Firefox, но не в IE.
Мы не можем загрузить несколько файлов с помощью IE?

Ответы [ 4 ]

4 голосов
/ 12 июля 2012

Я использовал следующий код для загрузки нескольких файлов в IE и Chrome

function downloadFile(url)
{
    var iframe = document.createElement("iframe");
    iframe.src = url;
    iframe.style.display = "none";
    document.body.appendChild(iframe);
}

function downloadFiles(urls)
{
    downloadFile(urls[0]);
    if (urls.length > 1)
        window.setTimeout(function () { downloadFiles(urls.slice(1)) }, 1000);
}

Вы передаете массив URL в функцию downloadFiles (), которая будет вызывать функцию downloadFile () для каждого скороткая задержка между.Задержка, кажется, ключ к тому, чтобы заставить его работать!

4 голосов
/ 18 марта 2011

По умолчанию загрузка файлов, не инициированных пользователем, блокируется в IE.Это по сути означает, что не должно быть возможности загрузить более одного файла в результате одного щелчка пользователя.

0 голосов
/ 22 августа 2018

Это может быть сделано путем создания большого двоичного объекта с использованием URL-адреса исходного файла. Я протестировал это с изображениями и PDF-файлами в IE 11.

                if (navigator.msSaveBlob) {
                    var xhr = new XMLHttpRequest();
                    xhr.open('GET', file_url, true);
                    xhr.responseType = 'blob';

                    xhr.onload = function(e) {
                       if (this.status == 200) {
                           var blob = this.response;
                           navigator.msSaveBlob(blob, file_name);
                       }
                    }

                    xhr.onerror = function(e) {
                        alert("Error " + e.target.status + " occurred while receiving the document.");
                    }

                    xhr.send();
                }

Я понял эту идею, когда наткнулся на следующее: Получение BLOB-данных из XHR-запроса

0 голосов
/ 15 марта 2014

У меня была похожая потребность, но я также хотел, чтобы загрузка происходила в новом окне.

Я создал js для загрузки списка файлов и php для фактического сохранения файла. Я использовал вышеуказанное в качестве отправной точки, и PHP начинался с (хорошо, не могу найти исходный код). Я кодирую переданный URI, чтобы пробелы в именах файлов не вызывали проблем.

(function () {
"use strict";

var files = [],              // Array of filename strings to download
newWindow,                   // New window to handle the download request
secondsBetweenDownloads;     // Wait time beteen downloads in seconds
//
//  Download a file using a new window given a URI
//
  function downloadFile(uri) {
    if (!newWindow) {
        newWindow = window.open('',
            '',
            'width=1500 height=100');
    }
    if (newWindow) {
        newWindow.location =
            'saveAs.php?' +
            'file_source=' + encodeURI(uri);
        newWindow.document.title = "Download File: " + uri;
    } else {
        console.log("Unable to open new window.  Popups blocked?");
    }
}
//
//  Download all files specified in the files[] array from siteName.
//  Download the file at array position zero, then set a timeout for
//  secondsBetweenDownloads seconds
//
function downloadFiles(siteName) {
    var showTime = new Date();

    console.log(
            showTime.toTimeString().substring(0,8)  +
            " Starting download for: " + files[0]
        );
    // Skip any empty entries, download this file
    if (files[0].length > 0) downloadFile(siteName + files.splice(0, 1));  
    if (files.length > 0) {                     // If more files in array
             window.setTimeout(function () {    // Then setup for another iteration
                downloadFiles(siteName );
            }, secondsBetweenDownloads * 1000); // Delay for n seconds between requests
     } else {
        newWindow.close();                      // Finished, close the download window
     }
}
//
//  Set the web site name and fill the files[] array with the files to download
//  then kick off the download of the files.
//
$(document).ready(function () {
    var
    siteName** = "http://www.mysteryshows.com/thank-you/";
    secondsBetweenDownloads** = 35;   // N seconds delay between requests

    files = [
        "show1.mp3",
        "show2.mp3"
   ];
    downloadFiles(siteName, files);
});
}());

HTML-код страницы прост. В основном подойдет любая страница, совместимая с синтаксисом.

Страница saveAs.php, которую js-файл использует в строке newWindow.location, - только php.

     <?php
    if (isset($_GET['file_source'])) {
        $fullPath = $_GET['file_source'];
        if($fullPath) {
            $fsize = filesize($fullPath);
            $path_parts = pathinfo($fullPath);
            $ext = strtolower($path_parts["extension"]);
            switch ($ext) {
                case "pdf":
                header("Content-Disposition: attachment;
                filename=\"".$path_parts["basename"]."\""); // use 'attachment' to 
                                                            // force a download
                header("Content-type: application/pdf"); // add here more headers for 
                                                         // diff. extensions
                break;
                default;
                header("Content-type: **application/octet-stream**");
                header("Content-Disposition: 
                   filename=\"".$path_parts["basename"]."\"");
            }
            if($fsize) {//checking if file size exist
                header("Content-length: $fsize");
            }
            $request = $path_parts["dirname"] . '/' .
                rawurlencode($path_parts["basename"]);
            readfile($request);
            exit;
        }
    }
?>

Я использовал rawurlencode только для части «базовое имя» URI, чтобы убедиться, что это действительный закодированный запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...