stadly/file-waiter

轻松实现文件服务。一个用于通过HTTP从任何文件系统提供文件的PHP库,支持条件请求和范围请求。

v1.1.0 2023-09-22 10:24 UTC

This package is auto-updated.

Last update: 2024-09-22 13:23:52 UTC


README

Latest Version on Packagist Software License Coverage Status Quality Score Total Downloads

轻松实现文件服务。一个用于通过HTTP从任何文件系统提供文件的PHP库,支持条件请求和范围请求。

安装

通过Composer

$ composer require stadly/file-waiter

用法

use Stadly\FileWaiter\Adapter\Local;
use Stadly\FileWaiter\File;
use Stadly\FileWaiter\Waiter;

$streamFactory = new \GuzzleHttp\Psr7\HttpFactory();                // Any PSR-17 compatible stream factory.
$file = new File(new Local('filename.txt', $streamFactory));        // Or another file adapter. See below.
$responseFactory = new \GuzzleHttp\Psr7\HttpFactory();              // Any PSR-17 compatible response factory.

$waiter = new Waiter($file, $responseFactory);

$request = \GuzzleHttp\Psr7\ServerRequest::fromGlobals();           // Any PSR-7 compatible server request.

$response = $waiter->handle($request);                              // The response is created by the response factory.

$emitter = new \Laminas\HttpHandlerRunner\Emitter\SapiEmitter();    // Any way of emitting PSR-7 responses.
$emitter->emit($response);
die();

条件请求

FileWaiter 自动处理条件请求,通过查看头信息 If-MatchIf-None-MatchIf-Modified-SinceIf-Unmodified-SinceIf-Range

$request = new \GuzzleHttp\Psr7\ServerRequest('GET', '');           // Any PSR-7 compatible server request.
$request = $request->withHeader('If-None-Match', '"foo"');

$response = $waiter->handle($request);                              // 304 Not Modified if the file's entity tag is "foo".

范围请求

FileWaiter 通过查看头信息 Range 自动处理范围请求。

$request = new \GuzzleHttp\Psr7\ServerRequest('GET', '');           // Any PSR-7 compatible server request.
$request = $request->withHeader('Range', 'bytes=10-20');

$response = $waiter->handle($request);                              // Response contains only the requested bytes.

文件适配器

通过使用文件适配器,FileWaiter 可以从任何文件系统提供文件。 FileWaiter 包含用于从本地文件系统提供文件的适配器。其他适配器可以单独安装。以下是当前可用的适配器列表

  • Local:用于提供存储在本地文件系统中的文件。
  • ByteString:用于提供存储在字符串中的文件。
  • Flysystem:用于提供存储在 Flysystem 中的文件。

可以通过实现 Stadly\FileWaiter\Adapter 来轻松创建额外的文件适配器。通过使用 Flysystem 的可用适配器,大多数需求应该已经得到满足。

通常,文件信息(如文件名、文件大小、媒体类型、最后修改日期和实体标签)由文件适配器提供。然而,在某些情况下,可能不希望提供这些信息(例如,如果您已经在数据库中存储了媒体类型或自定义实体标签)或不可能提供(例如,ByteString 适配器无法提供文件名和最后修改日期)。在这种情况下,您可以覆盖文件适配器填充的文件信息。您还可以指定文件适配器应填充哪些信息,以防止填充可能代价高昂检索的不必要信息。

use Stadly\FileWaiter\File;
use Stadly\FileWaiter\Adapter\Local;
use Stadly\Http\Header\Value\EntityTag\EntityTag;

$populateInfo = File::ALL_INFO ^ File::ENTITY_TAG;                  // Do not populate entity tag.
$file = new File(new Local('filename.txt', $streamFactory), $populateInfo);
$file->setEntityTag(new EntityTag('foo'));                          // Set custom entity tag.

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

测试

$ composer test

贡献

有关详细信息,请参阅 CONTRIBUTINGCODE_OF_CONDUCT

安全

如果您发现任何与安全相关的问题,请通过电子邮件 [email protected] 反馈,而不是使用问题跟踪器。

鸣谢

许可

MIT许可(MIT)。有关更多信息,请参阅 LICENSE