Laravel: Ajax - как «заставить» скачать pdf из каталога хранилища - PullRequest
0 голосов
/ 04 апреля 2019

Да ... Я знаю, что тема может показаться двуличной, но я использовал несколько альтернатив, найденных в stackoverflow, но практически все попытки потерпели неудачу.

Сценарий

  • Laravel Framework 5.7.11 (в настоящее время я не могу выполнить обновление до версии 5.8).
  • league / flysystem v1.0.51 (последнее обновление).

Требование

  • Дважды щелкните по строке 'Datatables' и загрузите файл PDF.

Маршрутизатор

Route::get('/download/{id?}', 'Mensagem\DocumentoController@download')->name('Documento.download');

Контроллер

    public function download()
    {
       return response()->download(storage_path('app/' . 'storage_app_file.pdf'));
    }

jQuery / Ajax

/* DOUBLE CLICK ROW */
$datatable.find("tbody").on("dblclick", "tr", function() {
  let data = table.row(this).data();

  $.ajax({
    url: '{{route("Documento.download")}}',
    type: "get",
    contentType: false,
    processData: false,
    cache: false,

    beforeSend: function() {
      console.log("double click beforeSend...");
    },

    success: function() {
      console.log("DOUBLE CLICK ROW: success...");
    }
  });
});

Результат (в результате отсутствует файл загрузки и «содержимое binany»)) enter image description here

enter image description here

* Обновлено 209-04-04 15: 23

Возможное решение ...

По какой-то причине просто с помощью ...

{{--window.open = '{{route("Documento.download")}}';--}}

... даже изменив имя файла в контроллере, всегда загружая один и тот же файл раньше...

Я решил сделать ответ Macro:

        \Response::macro('attachment', function ($content) {

            $rand = mt_rand(11111, 99999);

            $filename = 'download-' . "{$rand}" . '.pdf';

            $headers = [
                'Content-type'        => 'application/pdf',
                'Content-Disposition' => 'attachment; filename="' . $filename .
                    '"',
                'Content-Transfer-Encoding' => 'Binary"',
            ];

            return \Response::make($content, 200, $headers);

        });

... и в контроллере:

$file = \Storage::disk('local')->get( $name );
return response()->attachment( $file );

... в режиме двойного щелчка ...

                let myWindow = window.open('{{route("Documento.download")}}', '_blank', 'location=yes,height=400,width=300,scrollbars=yes,status=yes');

                setTimeout(() => myWindow.close(), 3000);

1 Ответ

1 голос
/ 04 апреля 2019

Почему Аякс?Я думаю, что самый простой способ это:

$datatable.find("tbody").on("dblclick", "tr", function() {
  window.location = '{{route("Documento.download")}}';
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...