Как загрузить файл с помощью метода post? [Дубликат]

Здесь было много полезных ответов, в целом достигающих высшей точки в два пункта.

  1. BACKTICKS() `используются вокруг имен идентификаторов.
  2. QUOTES(') используются вокруг значений.

И как @MichaelBerkowski сказал

Backticks должны использоваться для идентификаторов таблиц и столбцов, но необходимы только тогда, когда идентификатор является MySQL зарезервированным ключевое слово или когда идентификатор содержит символы пробела или символы за пределами ограниченного набора (см. ниже) Часто рекомендуется избегать использования зарезервированных ключевых слов в качестве идентификаторов столбцов или таблиц, если это возможно, во избежание проблемы с кавычками.

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

ПРИМЕР

123E10 является допустимым именем идентификатора, а также действительным INTEGER литералом.

[Не вдаваясь в подробности, как вы могли бы получить такое имя идентификатора] Предположим, что я хочу создать временную таблицу с именем 123456e6.

Нет ОШИБКИ на обратных циклах.

DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

ОШИБКА, если вы не используете обратные ссылки.

DB [XXX]> create temporary table 123451e6 (`id` char (8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1

Однако 123451a6 [* g15]

DB [XXX]> create temporary table 123451a6 (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

Это полностью, потому что 1234156e6 также является показательным номером.

65
задан 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 28 August 2018 в 09:32
поделиться

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

    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 28 August 2018 в 09:32
поделиться

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

window.location = 'download.php';

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

37
ответ дан Jelle Kralt 28 August 2018 в 09:32
поделиться

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

 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();
 }
14
ответ дан João Marcos 28 August 2018 в 09:32
поделиться

Решение для кросс-браузера, протестированное в 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 28 August 2018 в 09:32
поделиться

Возможно. Вы можете запустить загрузку изнутри функции 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 28 August 2018 в 09:32
поделиться

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

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

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

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