Created
November 17, 2018 00:26
-
-
Save Abdelhady/22ba137febd4ab8d1e92ef6d54b1ffdd to your computer and use it in GitHub Desktop.
Tus implementation - Final version
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var tus = require("tus-js-client"); | |
$('#uploadBtn').change(function () { | |
var file = this.files[0]; | |
if (typeof file === "undefined") { | |
return; | |
} | |
// some validations goes here using `file.size` & `file.type` | |
var upload = new tus.Upload(file, { | |
// https://github.com/tus/tus-js-client#tusdefaultoptions | |
endpoint: "/tus", | |
retryDelays: [0, 1000, 3000, 5000, 10000], | |
overridePatchMethod: true, // Because production-servers-setup doesn't support PATCH http requests | |
chunkSize: 1000 * 1000, // Bytes | |
metadata: { | |
filename: file.name, | |
filetype: file.type | |
}, | |
onError: function (error) { | |
// Handle errors here | |
}, | |
onProgress: function (bytesUploaded, bytesTotal) { | |
// Reflect values on your progress bar using `bytesTotal` & `bytesUploaded` | |
}, | |
onSuccess: function () { | |
// Upload has been completed | |
} | |
}); | |
// Start the upload | |
upload.start(); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class TusController { | |
public function indexAction() { | |
// Disable views/layout the way suites your framework | |
$server = $this->_getTusServer(); | |
$response = $server->serve(); | |
$this->_fixNonSecureLocationHeader($response); | |
$response->send(); | |
} | |
private function _getTusServer() { | |
TusPhp\Config::set([ | |
/** | |
* File cache configs. | |
* | |
* Adding the cache in the '/tmp/' because it is the only place writable by | |
* all users on the production server. | |
*/ | |
'file' => [ | |
'dir' => '/tmp/', | |
'name' => 'tus_php.cache', | |
], | |
]); | |
$server = new TusPhp\Tus\Server(); // Using File Cache (over Redis) for simpler setup | |
$server->setApiPath('/tus/index') // tus server endpoint. | |
->setUploadDir('/tmp'); // uploads dir. | |
return $server; | |
} | |
/** | |
* The `location` header is where the client js library will upload the file through, | |
* But, the load-balancer takes the `https` request & passes it as | |
* `http` only to the servers, which is tricking Tus server, | |
* so, we have to change it back here. | |
* | |
* @param type $response | |
*/ | |
private function _fixNonSecureLocationHeader(&$response) { | |
$location = $response->headers->get('location'); | |
if (!empty($location)) {// `location` is sent to the client only the 1st time | |
$location = preg_replace("/^http:/i", "https:", $location); | |
$response->headers->set('location', $location); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment