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 应遵循的步骤:

  1. 使用 AJAX 从您的 public 站点(用户站点)到 API 服务器,带文件 ID.

  2. API 服务器获取 PDF,将其复制到 public/users/ 目录,生成该 PDF 文件的 URL。

  3. 将 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>");

});