Laravel 下载存储在单独 Laravel 应用程序中的 pdf 文件
Laravel download pdf file stored in separate Laravel app
我有 2 个 Laravel(5.8) 应用程序。一个是用户应用程序,另一个更像是 API.
Api 的存储目录中存储了 pdf,我需要能够允许用户在其他应用程序中下载 pdf。
真的不知道如何将文件从一个应用程序发送到另一个应用程序。
用户应用程序使用相关文件 ID 和内容向 api 发送 api(很好),只是不知道如何发回文件,然后在另一端。
在 api 和 return response()->download($responeFromApiCall)
上尝试了诸如 return response()->stream($pdf)
之类的东西以及大量其他东西,但确实进展缓慢。
欢迎任何建议。
因此,如果我理解正确的话,您有两个系统:用户应用程序和 api。您希望将 pdf 从用户应用程序提供给实际用户。用户应用调用 api,效果很好。您的问题是将 api 的响应转换为您可以从用户应用程序提供的响应,对吗?
在那种情况下,我会说您想通过用户应用程序将来自 api 的响应代理给用户。我不知道用户应用程序和 api 之间的连接是什么,但是如果您使用 Guzzle,您可以查看 .
您发布的 laravel 代码基本正确,您可以使用 stream()
、download()
或 file()
帮助程序之一来提供文件。
file()
使用二进制响应提供文件,这是最直接的解决方案。
// optional headers
$headers = [];
return response()->file(storage_path('myfile.zip'), $optionalHeaders);
您也可以使用自己的绝对文件路径代替 storage_path
助手。
download()
下载助手类似于 file()
,但它还设置了 Content-Disposition
header,如果您使用浏览器检索文件,这将导致 download-popup .
$location = storage_path('myfiles/invoice_document.pdf');
// Optional: serve the file under a different filename:
$filename = 'mycustomfilename.pdf';
// optional headers
$headers = [];
return response()->download($location, $filename, $headers);
stream()
stream()
助手有点复杂,会导致以块的形式读取和提供文件。这可用于文件大小未知的情况(例如从 API 传递另一个传入流)。它导致 Transfer-Encoding: chunked
header 表明数据流被分成一系列 non-overlapping 块:
// optional status code
$status = 200;
// optional headers
$headers = [];
// The stream helper requires a callback:
return response()->stream(function() {
// Load a file from storage.
$stream = Storage::readStream('somebigfile.zip');
fpassthru($stream);
if(is_resource($stream)) {
fclose($stream);
}
}, $status, $headers);
注意:Storage::readStream
采用config/filesystems.php
中定义的默认存储磁盘。您可以使用 Storage::disk('aws')->readStream(...)
.
更改磁盘
正在检索您提供的文件
假设您的文件在 GET example.com/file
下提供,那么另一个应用程序可以使用 curl 检索它(假设 PHP)。一个流行的包装器是 Guzzle
:
$client = new \GuzzleHttp\Client();
$file_path = __DIR__ . '/received_file.pdf';
$response = $client->get('http://example.com/file', ['sink' => $file_path]);
顺便说一句,您可以从请求本身导出文件名和扩展名。
如果您的前端是 javascript,那么您也可以检索文件,但这是另一个组件,我没有一个简单的示例。
以下是获取 PDF 应遵循的步骤:
使用 AJAX 从您的 public 站点(用户站点)到 API 服务器,带文件 ID.
API 服务器获取 PDF,将其复制到 public/users/ 目录,生成该 PDF 文件的 URL。
将 URL 作为响应发送回用户站点。使用 JS 在 DOM 中向该 PDF 文件添加一个按钮/ link。
示例:
jQuery.post(ajaxurl, data, function(response) {
var responseData = JSON.parse(response);
var result = responseData.result;
var pdf_path = responseData.pdf_path;
$(".nametag-loader").remove();
$(".pdf-download-wrapper").append("<a class='download-link' href='"+ pdf_path +"' target='_blank'>Download</a>");
});
我有 2 个 Laravel(5.8) 应用程序。一个是用户应用程序,另一个更像是 API.
Api 的存储目录中存储了 pdf,我需要能够允许用户在其他应用程序中下载 pdf。
真的不知道如何将文件从一个应用程序发送到另一个应用程序。
用户应用程序使用相关文件 ID 和内容向 api 发送 api(很好),只是不知道如何发回文件,然后在另一端。
在 api 和 return response()->download($responeFromApiCall)
上尝试了诸如 return response()->stream($pdf)
之类的东西以及大量其他东西,但确实进展缓慢。
欢迎任何建议。
因此,如果我理解正确的话,您有两个系统:用户应用程序和 api。您希望将 pdf 从用户应用程序提供给实际用户。用户应用调用 api,效果很好。您的问题是将 api 的响应转换为您可以从用户应用程序提供的响应,对吗?
在那种情况下,我会说您想通过用户应用程序将来自 api 的响应代理给用户。我不知道用户应用程序和 api 之间的连接是什么,但是如果您使用 Guzzle,您可以查看
您发布的 laravel 代码基本正确,您可以使用 stream()
、download()
或 file()
帮助程序之一来提供文件。
file()
使用二进制响应提供文件,这是最直接的解决方案。
// optional headers
$headers = [];
return response()->file(storage_path('myfile.zip'), $optionalHeaders);
您也可以使用自己的绝对文件路径代替 storage_path
助手。
download()
下载助手类似于 file()
,但它还设置了 Content-Disposition
header,如果您使用浏览器检索文件,这将导致 download-popup .
$location = storage_path('myfiles/invoice_document.pdf');
// Optional: serve the file under a different filename:
$filename = 'mycustomfilename.pdf';
// optional headers
$headers = [];
return response()->download($location, $filename, $headers);
stream()
stream()
助手有点复杂,会导致以块的形式读取和提供文件。这可用于文件大小未知的情况(例如从 API 传递另一个传入流)。它导致 Transfer-Encoding: chunked
header 表明数据流被分成一系列 non-overlapping 块:
// optional status code
$status = 200;
// optional headers
$headers = [];
// The stream helper requires a callback:
return response()->stream(function() {
// Load a file from storage.
$stream = Storage::readStream('somebigfile.zip');
fpassthru($stream);
if(is_resource($stream)) {
fclose($stream);
}
}, $status, $headers);
注意:Storage::readStream
采用config/filesystems.php
中定义的默认存储磁盘。您可以使用 Storage::disk('aws')->readStream(...)
.
正在检索您提供的文件
假设您的文件在 GET example.com/file
下提供,那么另一个应用程序可以使用 curl 检索它(假设 PHP)。一个流行的包装器是 Guzzle
:
$client = new \GuzzleHttp\Client();
$file_path = __DIR__ . '/received_file.pdf';
$response = $client->get('http://example.com/file', ['sink' => $file_path]);
顺便说一句,您可以从请求本身导出文件名和扩展名。
如果您的前端是 javascript,那么您也可以检索文件,但这是另一个组件,我没有一个简单的示例。
以下是获取 PDF 应遵循的步骤:
使用 AJAX 从您的 public 站点(用户站点)到 API 服务器,带文件 ID.
API 服务器获取 PDF,将其复制到 public/users/ 目录,生成该 PDF 文件的 URL。
将 URL 作为响应发送回用户站点。使用 JS 在 DOM 中向该 PDF 文件添加一个按钮/ link。
示例:
jQuery.post(ajaxurl, data, function(response) {
var responseData = JSON.parse(response);
var result = responseData.result;
var pdf_path = responseData.pdf_path;
$(".nametag-loader").remove();
$(".pdf-download-wrapper").append("<a class='download-link' href='"+ pdf_path +"' target='_blank'>Download</a>");
});