从 Laravel 中的存储档位生成带有动态图像的 PDF

Posted

技术标签:

【中文标题】从 Laravel 中的存储档位生成带有动态图像的 PDF【英文标题】:Generating PDF with dynamic image from storage stalls in Laravel 【发布时间】:2018-05-21 16:10:16 【问题描述】:

我对生成 PDF 的视图和生成的内容有疑问。目前,我一直在使用 niklasravnsborg\LaravelPdf(mPDF 的包装器,因为我之前正在使用的另一个 PDF 编写器存在问题),结果是我想要的质量很好的 PDF。

虽然我之前从未在使用此 PDF 编写器时遇到过视图内的图像问题,但我必须承认它们与已在视图内设置的图像(如徽标,而不是说员工照片)。

我的问题出现的方式至少让我能够更好地追踪问题。

从我的控制器中,我得到以下信息:

$employeeMedCert = $employee->attachments()->where('category','Medical Examiners Certificate')->orderBy('endDate','desc')->limit(1)->get();

然后在我的刀片中,我有以下内容:

@foreach($employeeMedCert as $med)
    Storage::url($med->attachment)
 @endforeach

现在,通过当前的设置,我得到了附件的公共路径,完全没有任何问题。

但是,如果我执行以下操作:

@foreach($employeeMedCert as $med)
    <img src="Storage::url($med->attachment)">
@endforeach

它使我的 Laravel 停顿到我必须重置服务器并且没有生成任何东西的地步。

我不确定问题是什么,就像我说的那样,我之前对图像没有任何问题,而且我动态引用的图像无论如何都不大(300 - 600 kB),所以我是不确定问题到底出在哪里。

上传控制器动作:

        $path = Storage::putFile('public/employees', new File(request('file')));

        employeeAttachment::create([
                        'attachment' => $path,
                        'attachmentType' => Storage::mimeType($path),
                        'category' => $request->type,
                        'endDate' => $request->dueDate,
                        'date' => $request->date,
                        'employeeID' => $employee,
                        'createdBy' =>  Auth::id()
                    ]);      

【问题讨论】:

@enforeach 应该是 @endforeach。可能导致您的问题与未关闭的循环有关。 @hdifen - 不幸的是,这只是这篇文章的一个错字。如果是这样就好了。 我的假设是 Storage::url() 需要一个字符串,并且看起来您正在传递一个对象。你试过Storage::url($med-&gt;attachment-&gt;url)吗? @hdifen - 请在底部查看我的上述更改。你指的是那个吗?因为不幸的是,这也导致了一个问题...... 您的命名约定让我有些困惑,抱歉,这不是您的问题。我会考虑的 【参考方案1】:

这个问题的主要线索是,在 html 中,&lt;img&gt; 标签在 html 中运行时会执行 get 请求。这意味着您可能遇到权限错误。

您可以通过在 chrome 中打开您的开发工具并在任何具有图像标签的网站中检查您的服务器请求来检查这一点。

需要检查以下事项(假设您使用的是基本存储,例如不使用 AWS):

    图片是否在您的公用文件夹中,或者您是否正确创建了符号链接:https://laravel.com/docs/5.6/filesystem。 如果您的文件是公开的,您可以在浏览器中导航到它吗? 您是否尝试过使用 url 而不是通过存储?例如&lt;img src="base_url() . $med-&gt;attachment)"&gt;(假设 $med-&gt;attachment 是文件路径)。

假设它是一个公共文件,您不必通过Storage 外观来访问它。如果这为您指明了正确的方向,请告诉我。

Storage门面的目的是保存文件和获取文件并将它们加载到一个php变量中。目前,您正在从服务器加载文件,然后将图像标签指向文件,而不是指向图像存储位置的 url。

img 标签中输入一个有效的网址应该可以解决您的问题(如上图 3 所示)。

【讨论】:

除了数字 3 之外,我什么都有。我的问题(也许你可以引导我朝着正确的方向前进,目前,返回的附件路径(仅通过 $med ->attachment) 是“public/employees/lAwWqHfur0aLx071KRdaxEyhx4Hh60ktjziUBklk.jpeg” - 这是一个问题,因为要找到它,它需要有 URL“/storage/employees/....” 你在.htaccess 中重写你的url 以不具有'public'? 我还没有碰过这个,但是你的评论让我想知道 - 我实际上继承了这个项目,并且正在尝试执行一些急需的更新,此时,当用户上传一些附件时种类,这是下面的控制器过程,在这种特殊情况下是否有更好的处理方法? (见上文编辑) 看起来不错。您可以转到dd(base_url() . $med-&gt;attachment); 并检查您是否可以在浏览器中转到该网址吗?您应该会看到图像。 你想让我把它放在控制器的哪个位置,这样我就可以得到你想要的结果?

以上是关于从 Laravel 中的存储档位生成带有动态图像的 PDF的主要内容,如果未能解决你的问题,请参考以下文章

laravel rest api将文件上传到服务器

Laravel DOMPDF:如何从存储文件夹加载图像?

Laravel Spark 不显示存储在 /storage/app/public/profiles/ 目录中的图像

使用带有 MPDF 的动态 php 生成的图像

带有Laravel Mix的字体和图像源位于子文件夹中

laravel 5.1中的PDF图像缩略图预览?