Force загружает файл с помощью PHP через ajax [duplicate]

Я использовал новый установщик Eclipse. Мне не понравился путь установки, и я изменил его вручную. После этого я получил сообщение exit = 13.

В файле eclipse.ini есть новое свойство с именем -install . Мне нужно было изменить его с новым местоположением и решить эту проблему.

В новом установщике я выбрал D: / eclipse , но IDE была установлена ​​в D: / затмение / затмение . Итак, я переместил папку вручную. В следующий раз, когда я попытался открыть eclipse, я получил ошибку выхода. Таким образом, мне пришлось изменить eclipse.ini и установить текущее местоположение:

  -install D: / eclipse  
67
задан Manuel Di Iorio 29 December 2013 в 23:35
поделиться

7 ответов

Обновление 27 апреля 2015 г.

. Вверх и переход на сцену HTML5 - это атрибут загрузки . Это поддерживается в Firefox и Chrome, и скоро появится IE11. В зависимости от ваших потребностей вы можете использовать его вместо запроса AJAX (или используя window.location), пока файл, который вы хотите загрузить, находится в том же месте, что и ваш сайт.

Вы всегда можете сделать запрос AJAX / window.location откат с помощью некоторого JavaScript , чтобы проверить, поддерживается ли download, а если нет, переключая его на вызов window.location.

Оригинальный ответ

У вас не может быть запрос AJAX открыть приглашение для загрузки, так как вы физически должны перейти к файлу, чтобы запросить загрузку. Вместо этого вы можете использовать функцию успеха, чтобы перейти к download.php. Это откроет приглашение для загрузки, но не изменит текущую страницу.

$.ajax({
    url: 'download.php',
    type: 'POST',
    success: function() {
        window.location = 'download.php';
    }
});

Несмотря на то, что это отвечает на вопрос, лучше просто использовать window.location и полностью исключить запрос AJAX.

87
ответ дан Community 16 August 2018 в 05:09
поделиться
  • 1
    спасибо, просто окно.location разрешило что-нибудь :) – Manuel Di Iorio 29 December 2013 в 23:51
  • 2
    Разве это не вызывает ссылку дважды? Я нахожусь в подобной лодке ... Я передаю много информации о безопасности в заголовках и умею разбирать файл-объект в функции успеха, но не знаю, как вызвать приглашение загрузки. – user1447679 30 April 2015 в 01:13
  • 3
    Он дважды вызывает страницу, поэтому, если вы запрашиваете базу данных на этой странице, это означает, что вы совершите две поездки в БД. – mmmmmm 5 April 2016 в 07:43
  • 4
    Это не имеет никакого смысла, почему он получает поддержку? – Craig 30 June 2016 в 17:43
  • 5
  • 6
    Но он отправит запрос 2 раза, что не является правильным – Dharmendrasinh Chudasama 17 February 2018 в 14:07

Декодирование имени файла из заголовка немного сложнее ...

    var filename = "default.pdf";
    var disposition = req.getResponseHeader('Content-Disposition');

    if (disposition && disposition.indexOf('attachment') !== -1) 
    {
       var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
       var matches = filenameRegex.exec(disposition);

       if (matches != null && matches[1]) 
           filename = matches[1].replace(/['"]/g, '');
    }
0
ответ дан Jaime 16 August 2018 в 05:09
поделиться
  • 1
    Пожалуйста, отформатируйте весь блок кода и предоставите дополнительное объяснение вашему процессу для будущей выгоды читателя. – mickmackusa 21 March 2017 в 00:49

Для этого вам вообще не нужен ajax. Если вы просто установите «download.php» как href на кнопке или, если это не ссылка, используйте:

window.location = 'download.php';

Браузер должен распознать двоичную загрузку и не загружать фактическую страницу, а просто служит для загрузки файла.

36
ответ дан Jelle Kralt 16 August 2018 в 05:09
поделиться
  • 1
    Язык программирования, который вы используете для изменения window.location , это JavaScript. – mikemaccana 22 April 2014 в 19:50
  • 2
    Вы правы @mikemaccana, я на самом деле имел в виду ajax :). – Jelle Kralt 23 April 2014 в 08:26
  • 3
    Они охотятся высоко и низко для решения, и это настолько элегантно и идеально. Огромное спасибо. – Yangshun Tay 16 May 2016 в 09:27
  • 4
    Конечно, это решение будет работать, только если это статический файл, который уже существует. – krillgar 14 September 2017 в 19:25
  • 5
    Если сервер отвечает с ошибкой, хотя на главной странице не будет никакого способа оставаться на главной странице без перенаправления на страницу с ошибкой браузером. По крайней мере, это то, что делает Chrome, когда результат window.location возвращает 404. – Ian 30 May 2018 в 16:51

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

 function downloadFile(urlToSend) {
     var req = new XMLHttpRequest();
     req.open("GET", urlToSend, true);
     req.responseType = "blob";
     req.onload = function (event) {
         var blob = req.response;
         var fileName = req.getResponseHeader("fileName") //if you have the fileName header available
         var link=document.createElement('a');
         link.href=window.URL.createObjectURL(blob);
         link.download=fileName;
         link.click();
     };

     req.send();
 }
13
ответ дан João Marcos 16 August 2018 в 05:09
поделиться
  • 1
    Это работает для меня, но в firefox мне нужно было сначала поставить & lt; a & gt; тег в DOM и ссылаться на него как на мою ссылку, а не на создание «на лету», чтобы файл загружался автоматически. – Erik Donohoo 31 May 2017 в 20:49
  • 2
    работает, но что происходит, если файл создается во время выполнения? он не работает, как когда файл уже создан. – Diego 13 June 2017 в 02:16
  • 3
    – Taha Rehman Siddiqui 24 September 2018 в 17:53

Решение для кросс-браузера, протестированное в Chrome, Firefox, Edge, IE11.

В DOM добавьте тег скрытой ссылки:

<a id="target" style="display: none"></a>

Затем:

var req = new XMLHttpRequest();
req.open("GET", downloadUrl, true);
req.responseType = "blob";

req.onload = function (event) {
  var blob = req.response;
  var fileName = null;
  var contentType = req.getResponseHeader("content-type");

  // IE/EDGE seems not returning some response header
  if (req.getResponseHeader("content-disposition")) {
    var contentDisposition = req.getResponseHeader("content-disposition");
    fileName = contentDisposition.substring(contentDisposition.indexOf("=")+1);
  } else {
    fileName = "unnamed." + contentType.substring(contentType.indexOf("/")+1);
  }

  if (window.navigator.msSaveOrOpenBlob) {
    // Internet Explorer
    window.navigator.msSaveOrOpenBlob(new Blob([blob], {type: contentType}), fileName);
  } else {
    var el = document.getElementById("target");
    el.href = window.URL.createObjectURL(blob);
    el.download = fileName;
    el.click();
  }
};
req.send();
3
ответ дан leo 16 August 2018 в 05:09
поделиться

Возможно. Вы можете запустить загрузку изнутри функции ajax, например, сразу после создания файла .csv.

У меня есть функция ajax, которая экспортирует базу данных контактов в CSV-файл и просто после его завершения он автоматически запускает загрузку файла .csv. Итак, после получения ответаText и все в порядке, я перенаправляю браузер следующим образом:

window.location="download.php?filename=export.csv";

Мой файл download.php выглядит так:

<?php

    $file = $_GET['filename'];

    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=".$file."");
    header("Content-Transfer-Encoding: binary");
    header("Content-Type: binary/octet-stream");
    readfile($file);

?>

Нет обновите страницу, и файл автоматически начнет загрузку.

ПРИМЕЧАНИЕ. - Протестировано в следующих браузерах:

Chrome v37.0.2062.120 
Firefox v32.0.1
Opera v12.17
Internet Explorer v11
13
ответ дан Pedro Sousa 16 August 2018 в 05:09
поделиться
  • 1
    Разве это не опасно для безопасности? – Mickael Bergeron Néron 22 June 2016 в 17:32
  • 2
    @ MickaelBergeronNéron Почему? – Pedro Sousa 23 June 2016 в 08:12
  • 3
    Я бы так подумал, потому что любой может вызвать download.php? Filename = [something] и попробовать некоторые имена путей и файлов, особенно общие, и это может быть даже сделано внутри цикла в программе или скрипте. – Mickael Bergeron Néron 23 June 2016 в 12:43
  • 4
    не будет .htaccess избежать этого? – Pedro Sousa 23 June 2016 в 16:22
  • 5
    @PedroSousa .. нет. htaccess управляет доступом к файловой структуре через Apache. Поскольку доступ достиг скрипта PHP, htaccess теперь останавливает свою работу. Это ОЧЕНЬ БОЛЬШЕ дыр в безопасности, потому что действительно, любой файл, который PHP (и пользователь, которого он запускает), может читать, поэтому он может доставлять в файл read ... Всегда нужно дезинфицировать запрошенный файл для чтения – Prof83 26 July 2016 в 20:56

Я предпочитаю Location.assign ()

developer.mozilla.org/en-US/docs/Web/API/Location.assign

1
ответ дан Telmo Dias 16 August 2018 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: