stadly / file-waiter
轻松实现文件服务。一个用于通过HTTP从任何文件系统提供文件的PHP库,支持条件请求和范围请求。
Requires
- php: >=8.0
- guzzlehttp/psr7: ^1.7 || ^2.0
- psr/http-factory: ^1.0.1
- psr/http-message: ^1.0.1
- psr/http-server-handler: ^1.0
- stadly/http: ^1.2
Requires (Dev)
- guzzlehttp/psr7: ^2.4
- php-parallel-lint/php-parallel-lint: ^1.3
- phpstan/phpstan: ^1.0.0
- phpstan/phpstan-deprecation-rules: ^1.0.0
- phpstan/phpstan-phpunit: ^1.0.0
- phpstan/phpstan-strict-rules: ^1.0.0
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.5
- stadly/file-waiter-bytestring: ^1.0.1
- stadly/php-style: ^1.1.1
Suggests
- stadly/file-waiter-bytestring: To serve files from byte strings.
- stadly/file-waiter-flysystem: To serve files from the abstract filesystem Flysystem.
Provides
README
轻松实现文件服务。一个用于通过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-Match
、If-None-Match
、If-Modified-Since
、If-Unmodified-Since
和 If-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
贡献
有关详细信息,请参阅 CONTRIBUTING 和 CODE_OF_CONDUCT。
安全
如果您发现任何与安全相关的问题,请通过电子邮件 [email protected] 反馈,而不是使用问题跟踪器。
鸣谢
许可
MIT许可(MIT)。有关更多信息,请参阅 LICENSE。