flowjs / flow-php-server
处理分块上传的PHP库。与flow.js html5文件上传配合使用。
v1.2.0
2022-08-26 15:50 UTC
Requires
- php: >=5.4
Requires (Dev)
- ext-mongodb: *
- fabpot/php-cs-fixer: ~2.2
- league/phpunit-coverage-listener: ~1.1
- mikey179/vfsstream: v1.2.0
- mongodb/mongodb: ^1.4.0
- phpunit/phpunit: 4.*
Suggests
- mongodb/mongodb: Required to use this package with Mongo DB
README
处理分块上传的PHP库。库中包含以下辅助方法:
- 测试上传的分块文件是否存在。
- 验证文件分块
- 创建单独的分块文件夹
- 验证上传的分块
- 合并所有分块为一个单一文件
此库与HTML5文件上传库兼容:https://github.com/flowjs/flow.js
如何开始使用?
设置Composer: https://getcomposer.org.cn/doc/00-intro.md
在您的项目中运行此命令
composer require flowjs/flow-php-server
这将为您创建一个vendor目录,其中包含一个autoload.php文件。
创建一个名为upload.php
的新PHP文件
//Path to autoload.php from current location require_once './vendor/autoload.php'; $config = new \Flow\Config(); $config->setTempDir('./chunks_temp_folder'); $request = new \Flow\Request(); $uploadFolder = './final_file_destination/'; // Folder where the file will be stored $uploadFileName = uniqid()."_".$request->getFileName(); // The name the file will have on the server $uploadPath = $uploadFolder.$uploadFileName; if (\Flow\Basic::save($uploadPath, $config, $request)) { // file saved successfully and can be accessed at $uploadPath } else { // This is not a final chunk or request is invalid, continue to upload. }
确保./chunks_temp_folder
路径存在且可写。所有分块都将保存在此文件夹中。
如果您在这个示例中遇到困难,请阅读此问题:如何使用flow-php-server
高级使用
$config = new \Flow\Config(); $config->setTempDir('./chunks_temp_folder'); $file = new \Flow\File($config); if ($_SERVER['REQUEST_METHOD'] === 'GET') { if ($file->checkChunk()) { header("HTTP/1.1 200 Ok"); } else { header("HTTP/1.1 204 No Content"); return ; } } else { if ($file->validateChunk()) { $file->saveChunk(); } else { // error, invalid chunk upload request, retry header("HTTP/1.1 400 Bad Request"); return ; } } if ($file->validateFile() && $file->save('./final_file_name')) { // File upload was completed } else { // This is not a final chunk, continue to upload }
删除未完成的文件
为此,您应设置cron,它会检查每个分块上传的时间。如果分块上传时间过长,则应删除分块。
用于检查的辅助方法
\Flow\Uploader::pruneChunks('./chunks_folder');
可以通过使用随机函数执行来避免cron任务。
if (1 == mt_rand(1, 100)) { \Flow\Uploader::pruneChunks('./chunks_folder'); }
贡献
欢迎您的参与开发!
为确保源代码的一致性,在您的工作中请牢记以下规则:
- 所有功能或错误修复都必须由一个或多个spec进行测试。
- 您的代码应遵循PSR-2编码风格指南