【问题标题】:How to view pdf from routes in laravel?如何从laravel中的路线查看pdf?
【发布时间】:2016-03-06 09:18:42
【问题描述】:

试图从 laravel 中的 brochure/jan-2016.pdf', 'BrochureController@show'); 路径查看存储在 /public/assets/others/brochure/jan-2016.pdf 文件中的 pdf。

但我得到错误:Whoops, looks like something went wrong

路线代码:

Route::get('/brochure/{file}', 'BrochureController@show');

在控制器中:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class BrochureController extends Controller
{   
    public function show($filename)
    {       
        $filename = 'jan-2016.pdf';
        $filepath = 'assets/others/brochure/';
        $path = $filepath.$filename;

        return Response::make(file_get_contents($path), 200, [
        'Content-Type' => 'application/pdf',
        'Content-Disposition' => 'inline; '.$filename,
        ]);
    }
}

当我尝试仅打印文件内容时,它会捕获文件并使用file_get_contents($path)以某种奇怪的方式显示

输出: %PDF-1.4 %���� 1 0 obj &lt;&gt;stream PScript5.dll Version 5.2.2 GVTP January 2016 Dummy content endstream endobj 2 0 obj &lt;&gt; endobj 4 0 obj &lt;&gt; endobj 3 0 obj &lt;&gt; endobj 5 0 obj &lt;&gt;/Rotate 90/Parent 3 0 R/MediaBox[0 0 595 842]/Contents 11 0 R/Type/Page&gt;&gt; endobj 11 0 obj &lt;&gt;stream x��]Ys�u.;����8Ξ��d���z_�'�Z���Iت�� �$����_��oN�L�9=sw@��-...

这意味着它从确切的路径中选择文件。我相信指定读者将其作为第三方服务处理,例如:Adobe pdf 阅读器。

我做错了什么?

【问题讨论】:

  • 您说您的路线是Route::get('/view/{event}', 'PdfController@show');,那么您能否提供完整的show() 方法,以便我了解您是如何使用事件变量的?它可能被用于文件名吗?
  • 是的@Joseph,我故意更改了名称,但现在它与我在项目中的名称完全相同。请看一下

标签: php laravel pdf laravel-5


【解决方案1】:

考虑报价合同的例子


控制器:

<?php

namespace App\Http\Controllers;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Response;

class OfferController extends Controller
{
    public function index()
    {
        $file = public_path().DIRECTORY_SEPARATOR.'media'.DIRECTORY_SEPARATOR.'offer.pdf';
        $file = File::get($file);
        $response = Response::make($file,200);
        $response->header('Content-Type', 'application/pdf');
        return $response;
    }
}

路线:

Route::get('/offer','OfferController@index')->name('offer');

利润:

https://name.site/offer

【讨论】:

    【解决方案2】:

    这里是代码

    $filename = 'assets/others/129778.pdf';
    $path = storage_path().DIRECTORY_SEPARATOR.$filename;
    
    return Response::make($path, 200, [
    'Content-Type' => 'application/pdf',
    'Content-Disposition' => 'inline; '.$filename,
    ]);
    

    看看它是否有效并让我知道。

    【讨论】:

    • 我也从其他帖子中看到了这个答案。你能用storage_path()directory_separator那里详细说明吗
    • 您确定,您指定的路径正确吗?
    • 我可以直接从 url 访问那些,例如:http://localhost/laravel/project/public/assets/others/129778.pdf。但我不希望最终用户看到项目文件夹内容的相对路径。而且它还必须从浏览器默认的 pdf 查看器中查看。
    • 您需要添加整个 URL。不指定 URL 是不可能的
    • 如果我想在线部署这个项目,那么我必须按照您的建议将所有 localhost 更改为域名?但那是个坏主意,我需要从相对路径目录中获取它:(
    【解决方案3】:

    在 BrochureController.php 中

    public function show($filename)
    {
        $file = base_path(). "/public/assets/others/brochure/". $filename;
    
        $name = "Human Name For File.pdf";
    
        $headers = ['Content-Type: application/pdf'];
    
        return Response::download($file, $name, $headers);
    }
    

    现在在您的应用中访问http://example.com/brochure/jan-2016.pdf,就会下载 jan-2016.pdf 文件。

    如果您不希望用户猜测他们也可以访问http://example.com/assets/others/jan-2016.pdf,那么您可以将 PDF 移动到另一个不可公开访问的目录(例如 /resources/brochures),然后您可以只需将方法的第一行更改为:

    $file = base_path(). "/resources/brochures/". $filename;

    这意味着每个人都必须前往http://example.com/brochure/jan-2016.pdf 才能访问该文件。

    【讨论】:

    • 运气不好@Joseph,它也没有下载。我仍然收到同样的错误:(Whoops, looks like something went wrong。我正在考虑是否需要为此更改 laravel 或 apache 中的任何配置设置...
    • 我怀疑这是配置问题,除非您进行了更改。它应该开箱即用。你能发布完整的错误,而不仅仅是“哎呀”部分吗?
    【解决方案4】:

    你可以使用这个包 [barryvdh/laravel-dompdf][1]。并简单地使用如下: 这只是示例片段

    class BrochureController extends Controller
    {   
        public function show($filename)
        {       
            $html = 'Your content in PDF';    
    
            $pdf = PDF::loadHTML($html);
    
            //set the name of the pdf document
            $file_name = 'jan-2016.pdf';
    
            //check if the path exist or not
            if(!File::exists(storage_path() . '/pdf')) {
    
                 $result = File::makeDirectory(storage_path() . '/pdf');
            }
    
            $pdf->save(storage_path() . '/pdf/' . $file_name);
    
            //return $file_name;
    
            return $pdf->download($file_name);
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2018-09-16
      相关资源
      最近更新 更多