Created
October 16, 2012 12:50
-
-
Save fzerorubigd/3899077 to your computer and use it in GitHub Desktop.
A simple download script with resume and multi-part support
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 | |
date_default_timezone_set('GMT'); | |
//1- file we want to serve : | |
$data_file = "/home/f0rud/Aalto Talk with Linus Torvalds [Full-length].mp4"; | |
$data_size = filesize($data_file); //Size is not zero base | |
$mime = 'application/otect-stream'; //Mime type of file. to begin download its better to use this. | |
$filename = basename($data_file); //Name of file, no path included | |
//2- Check for request, is the client support this method? | |
if (isset($_SERVER['HTTP_RANGE']) || isset($HTTP_SERVER_VARS['HTTP_RANGE'])) { | |
$ranges_str = (isset($_SERVER['HTTP_RANGE']))?$_SERVER['HTTP_RANGE']:$HTTP_SERVER_VARS['HTTP_RANGE']; | |
$ranges_arr = explode('-', substr($ranges_str, strlen('bytes='))); | |
//Now its time to check the ranges | |
if ((intval($ranges_arr[0]) >= intval($ranges_arr[1]) && $ranges_arr[1] != "" && $ranges_arr[0] != "" ) | |
|| ($ranges_arr[1] == "" && $ranges_arr[0] == "") | |
) { | |
//Just serve the file normally request is not valid :( | |
$ranges_arr[0] = 0; | |
$ranges_arr[1] = $data_size - 1; | |
} | |
} else { //The client dose not request HTTP_RANGE so just use the entire file | |
$ranges_arr[0] = 0; | |
$ranges_arr[1] = $data_size - 1; | |
} | |
//Now its time to serve file | |
$file = fopen($data_file, 'rb'); | |
$start = $stop = 0; | |
if ($ranges_arr[0] === "") { //No first range in array | |
//Last n1 byte | |
$stop = $data_size - 1; | |
$start = $data_size - intval($ranges_arr[1]); | |
} elseif ($ranges_arr[1] === "") { //No last | |
//first n0 byte | |
$start = intval($ranges_arr[0]); | |
$stop = $data_size - 1; | |
} else { | |
// n0 to n1 | |
$stop = intval($ranges_arr[1]); | |
$start = intval($ranges_arr[0]); | |
} | |
//Make sure the range is correct by checking the file | |
fseek($file, $start, SEEK_SET); | |
$start = ftell($file); | |
fseek($file, $stop, SEEK_SET); | |
$stop = ftell($file); | |
$data_len = $stop - $start; | |
//Lets send headers | |
if (isset($_SERVER['HTTP_RANGE']) || isset($HTTP_SERVER_VARS['HTTP_RANGE'])) { | |
header('HTTP/1.0 206 Partial Content'); | |
header('Status: 206 Partial Content'); | |
} | |
header('Accept-Ranges: bytes'); | |
header('Content-type: ' . $mime); | |
header('Content-Disposition: attachment; filename="' . $filename . '"'); | |
header("Content-Range: bytes $start-$stop/" . $data_size ); | |
header("Content-Length: " . ($data_len + 1)); | |
//Finally serve data and done ~! | |
fseek($file, $start, SEEK_SET); | |
$bufsize = 2048000; | |
ignore_user_abort(true); | |
@set_time_limit(0); | |
while (!(connection_aborted() || connection_status() == 1) && $data_len > 0) { | |
echo fread($file, $bufsize); | |
$data_len -= $bufsize; | |
flush(); | |
} | |
fclose($file); |
working fine 👍
Thank you so much... It worked!
can i use this for vinaget source?
https://github.com/giaythuytinh176/vinaget-script
Hi,
$bufsize is what is this? And where is code limit the number of concurrent connections? And what is the code that determines download resume (support or not support download resume)?
Why does it stop working when the session starts?
For those who get invalid file format with this script, you should add ob_clean() in line66 after headers.
Line 9: a typo "otect-stream", should be "octet-stream".
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Brilliant Script Thanks....
i was searching last 3 days but not success.
you are my hero... thanks again.
please do same script for remote URL download with resume. example:- other video URL file via my site url.