Загрузка CSV вместо отображения Laravel 7 на Nginx - PullRequest
0 голосов
/ 27 апреля 2020

У меня проблема с получением файла для загрузки на моем рабочем сервере. Использование разных браузеров дает одинаковые результаты, успех на тестовом сервере, загрузка в виде файла без изменения текущей страницы. На рабочем сервере, однако, он просто открывает новую вкладку и отображает CSV в виде текста на странице. Я могу только понять, что это связано с сервером (Nginx). Могу ли я изменить серверный блок для обеспечения правильного поведения.

Javascript Код на стороне клиента

window.open('myfile.csv');

Laravel код контроллера

protected function download(){
    $filename=$_GET["filename"];
    //return response()->download(public_path()."/downloads".$filename);

    $fileContent = file_get_contents($filename);

    $response = response($fileContent, 200, [
        'Content-Type' => 'text/csv',
        'Content-Disposition' => 'attachment; filename="'.$filename.'"',
    ]);
    return $response;
}

Заголовки ответа:

Тестовый сервер

Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 318
Content-Type: application/octet-stream
Date: Mon, 27 Apr 2020 16:29:06 GMT
ETag: "5ea70851-13e"
Last-Modified: Mon, 27 Apr 2020 16:29:05 GMT
Server: nginx/1.16.1

Производственный сервер

Cache-Control: no-cache
Cache-Control: no-cache
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/plain
Date: Mon, 27 Apr 2020 16:32:00 GMT
ETag: W/"5ea70900-13e"
Expires: Mon, 27 Apr 2020 16:31:59 GMT
Last-Modified: Mon, 27 Apr 2020 16:32:00 GMT
Server: nginx/1.8.0
Transfer-Encoding: chunked

У меня есть только контроль блок виртуального сервера на производстве. Для подтверждения, следуя нескольким полезным постам - код РАБОТАЕТ на тестовом сервере и во всех браузерах, НЕ РАБОТАЕТ на рабочем сервере и во всех браузерах.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020
protected function download() {
    $filename = public_path() . "/downloads" . $_GET["filename"];
    $fileContent = file_get_contents($filename);
    return response($fileContent, 200,
        [
            'Content-Type' => 'text/csv',
            'Content-Disposition' => 'attachment; filename="' . $filename . '"'
        ]);
}
0 голосов
/ 28 апреля 2020

Пожалуйста, попробуйте следующее:

function downloadFile(fileName, type="text/plain") {
  // Create an invisible A element
  const a = document.createElement("a");
  a.style.display = "none";
  document.body.appendChild(a);

  // Set the HREF to a Blob representation of the data to be downloaded
  a.href = url;

  // Use download attribute to set set desired file name
  a.setAttribute("download", fileName);

  // Trigger the download by simulating click
  a.click();

  // Cleanup
  document.body.removeChild(a);
}

Дайте мне знать, если вы обнаружите какие-либо ошибки.

Надеюсь, это поможет вам

Спасибо

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