flow.js php server library, validates uploaded chunks and safely merges all chunks to a single file
PHP library for handling chunk uploads. Library contains helper methods for: * Testing if uploaded file chunk exists. * Validating file chunk * Creating separate chunks folder * Validating uploaded chunks * Merging all chunks to a single file
This library is compatible with HTML5 file upload library: https://github.com/flowjs/flow.js
Setup Composer: https://getcomposer.org/doc/00-intro.md
Run this command in your project:
composer require flowjs/flow-php-serverThis will create a vendor directory for you, which contains an autoload.php file.
Create a new php file named
upload.php: ```php //Path to autoload.php from current location require_once './vendor/autoload.php';
$config = new \Flow\Config(); $config->setTempDir('./chunkstempfolder'); $request = new \Flow\Request(); $uploadFolder = './finalfiledestination/'; // 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. } ```
Make sure that
./chunks_temp_folderpath exists and is writable. All chunks will be saved in this folder.
If you are stuck with this example, please read this issue: How to use the 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 }
For this you should setup cron, which would check each chunk upload time. If chunk is uploaded long time ago, then chunk should be deleted.
Helper method for checking this:
php \Flow\Uploader::pruneChunks('./chunks_folder');
Cron task can be avoided by using random function execution.
php if (1 == mt_rand(1, 100)) { \Flow\Uploader::pruneChunks('./chunks_folder'); }
Your participation in development is very welcome!
To ensure consistency throughout the source code, keep these rules in mind as you are working: * All features or bug fixes must be tested by one or more specs. * Your code should follow PSR-2 coding style guide