Laravel:Ajax-如何“强制”从存储目录下载pdf

时间:2019-04-04 16:39:47

标签: jquery ajax laravel

是的。我知道这个主题似乎是重复的,但是我使用了stackoverflow中的几种替代方法,但是实际上所有尝试都失败了。

场景

  • Laravel Framework 5.7.11(目前我无法升级到5.8版)。
  • league / flysystem v1.0.51(最新更新)。

要求

  • 双击“数据表”行并下载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")}}';--}}

...甚至在控制器中更改文件名,总是在...之前下载相同文件。

我决定制作一个Response宏:

        \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 个答案:

答案 0 :(得分:1)

为什么要使用ajax?我认为最简单的方法是:

t1.STATION LIKE '*' & t2.STATION & '*'