Laravel - pdf 文件的响应 returns 奇怪的文本而不是在浏览器中显示 pdf
Laravel - Response of a pdf file returns weird text instead of displaying pdf in browser
经过两天的阅读和寻找解决方案以及其他可能的方法后,我终于鼓励自己在这里寻求帮助。很多人都问过类似的问题,到目前为止,我已经使用了他们所有的解决方案并且很多人都提供了帮助。我完全卡在这一点上了。
关于我的问题:我想将 pdf 文件上传到存储目录,然后让用户可以通过单击一个简单的按钮来访问它们(使用 jquery ajax post 请求) .上传工作正常,PDF 最终位于正确的目录中,如标题所述,returning 文件也可以正常工作,但不是在浏览器中显示 pdf,它只是 returns a for most parts以以下内容开头的奇怪编码字符串:
%PDF-1.3
%âãÏÓ
我的jQuery代码:
$('input.btn-pdf').click(function () {
event.preventDefault();
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
url: '/big-picture/getPDF',
type: 'POST',
data: {'filename':$(this).val()},
success: function (data) {
}
});
});
作为用户点击按钮后,不应立即下载 PDF,因此我查阅了 Laravel (5.6) 文档并在我的控制器中使用了如下适当的响应方法:
public function getPDF(Request $request)
{
$headers = [
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, PATCH, DELETE',
'Access-Control-Allow-Headers' => 'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Authorization , Access-Control-Request-Headers',
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline'
];
return response()->file(storage_path("app\pdfs\".$request->filename), $headers);
}
正如我所说,它找到了文件并且我没有收到任何错误(状态代码 200)。我无法在 jquery ajax 调用的视图或成功区域中找到任何关于我必须在 return 文件作为响应以显示它的调用中执行任何操作的信息正确。我还在 return 之前检查了文件的文件类型,它正确地说 'application/pdf'。我首先收到了很多错误消息,然后我发现我必须使用正确的 header 才能使其正常工作,我做到了。现在它应该工作,但它没有。
这是回复header:
Accept-Ranges: none
Access-Control-Allow-Headers: Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Authorization , Access-Control-Request-Headers
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE
Access-Control-Allow-Origin: *
Cache-Control: public
Connection: close
Content-Disposition: inline
Content-Length: 1650653
Content-Type: application/pdf
Date: Fri, 31 Aug 2018 09:51:04 GMT
Date: Fri, 31 Aug 2018 09:51:04 +0000
Host: localhost:8000
Last-Modified: Thu, 30 Aug 2018 09:30:39 GMT
Set-Cookie: XSRF-TOKEN=aLongTokenHere; expires=Fri, 31-Aug-2018 11:51:04 GMT; Max-Age=7200; path=/
Set-Cookie: laravel_session=aLongSessionIdHere; expires=Fri, 31-Aug-2018 11:51:04 GMT; Max-Age=7200; path=/; httponly
X-Powered-By: PHP/7.2.4
提前谢谢你。我不仅对这个问题的解决方案感兴趣,而且如果有人对我的特定用例和 returning/displaying 顺利和智能地存储 PDF 有不同的想法,我非常愿意改变我的做事方式它。
祝大家有个愉快的一天。
我的解决方法:
我将不使用 laravel 的本地存储设施,而是使用 Drop Box 来存储 PDF 文件,并简单地将 PDF 的显示链接放在我的数据库中,稍后将传递到我的视图.
这不是我希望得到的解决方案,但它确实有效。
也许这对其他人有帮助。
经过两天的阅读和寻找解决方案以及其他可能的方法后,我终于鼓励自己在这里寻求帮助。很多人都问过类似的问题,到目前为止,我已经使用了他们所有的解决方案并且很多人都提供了帮助。我完全卡在这一点上了。
关于我的问题:我想将 pdf 文件上传到存储目录,然后让用户可以通过单击一个简单的按钮来访问它们(使用 jquery ajax post 请求) .上传工作正常,PDF 最终位于正确的目录中,如标题所述,returning 文件也可以正常工作,但不是在浏览器中显示 pdf,它只是 returns a for most parts以以下内容开头的奇怪编码字符串:
%PDF-1.3 %âãÏÓ
我的jQuery代码:
$('input.btn-pdf').click(function () {
event.preventDefault();
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
url: '/big-picture/getPDF',
type: 'POST',
data: {'filename':$(this).val()},
success: function (data) {
}
});
});
作为用户点击按钮后,不应立即下载 PDF,因此我查阅了 Laravel (5.6) 文档并在我的控制器中使用了如下适当的响应方法:
public function getPDF(Request $request)
{
$headers = [
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, PATCH, DELETE',
'Access-Control-Allow-Headers' => 'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Authorization , Access-Control-Request-Headers',
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline'
];
return response()->file(storage_path("app\pdfs\".$request->filename), $headers);
}
正如我所说,它找到了文件并且我没有收到任何错误(状态代码 200)。我无法在 jquery ajax 调用的视图或成功区域中找到任何关于我必须在 return 文件作为响应以显示它的调用中执行任何操作的信息正确。我还在 return 之前检查了文件的文件类型,它正确地说 'application/pdf'。我首先收到了很多错误消息,然后我发现我必须使用正确的 header 才能使其正常工作,我做到了。现在它应该工作,但它没有。
这是回复header:
Accept-Ranges: none Access-Control-Allow-Headers: Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Authorization , Access-Control-Request-Headers Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE Access-Control-Allow-Origin: * Cache-Control: public Connection: close Content-Disposition: inline Content-Length: 1650653 Content-Type: application/pdf Date: Fri, 31 Aug 2018 09:51:04 GMT Date: Fri, 31 Aug 2018 09:51:04 +0000 Host: localhost:8000 Last-Modified: Thu, 30 Aug 2018 09:30:39 GMT Set-Cookie: XSRF-TOKEN=aLongTokenHere; expires=Fri, 31-Aug-2018 11:51:04 GMT; Max-Age=7200; path=/ Set-Cookie: laravel_session=aLongSessionIdHere; expires=Fri, 31-Aug-2018 11:51:04 GMT; Max-Age=7200; path=/; httponly X-Powered-By: PHP/7.2.4
提前谢谢你。我不仅对这个问题的解决方案感兴趣,而且如果有人对我的特定用例和 returning/displaying 顺利和智能地存储 PDF 有不同的想法,我非常愿意改变我的做事方式它。
祝大家有个愉快的一天。
我的解决方法:
我将不使用 laravel 的本地存储设施,而是使用 Drop Box 来存储 PDF 文件,并简单地将 PDF 的显示链接放在我的数据库中,稍后将传递到我的视图.
这不是我希望得到的解决方案,但它确实有效。 也许这对其他人有帮助。