PHP Download Script With Resume Option | Php | Hypertext Transfer ...

April 1, 2016 | Author: Anonymous | Category: PHP
Share Embed


Short Description

Oct 31, 2012 - PHP Download Script with. Resume option. August 3, 2012/by Armand Niculescu. A while ago I wrote an artic...

Description

PHP Download Script with Resume option August 3, 2012/by Armand Niculescu

A while ago I wrote an article about the common pitfalls of handling file downloads in PHP. One thing I did not realize at that time is that in most cases developers don’t have the time to write such a script and they’ll use whatever they can find, even if it has flaws. Because of this, I decided to write a download script and release it free for everyone with a BSD License. It’s not a class, just a script that accepts a “file” parameter via GET or POST and outputs the file. For security purposes any paths are stripped and replaced with a path in the script (the folder containing the downloadable file(s) should be protected against direct access). The script sets the correct MIME type for ZIP files, all other files are sent as octet stream. You may customize that part depending on the type of docs you host. The download script also accepts range download but not multiple ranges; for the vast majority of cases this is enough. The script is in active use and has handled tens of thousands of downloads from a vast variety of browsers. I tested it only on Apache 2 / PHP 5. Some hosts have really weird setups and limitations but hopefully you won’t get any issues.

Here’s the full script (Updated on October 31, 2012): "application/octet-stream", "zip" => "application/zip", "mp3" => "audio/mpeg", "mpg" => "video/mpeg", "avi" => "video/x-msvideo", ); $ctype = isset($content_types[$file_ext]) ? $content_types[$file_ext] : $ctype_default; header("Content-Type: " . $ctype); //check if http_range is sent by browser (or download manager) if(isset($_SERVER['HTTP_RANGE'])) { list($size_unit, $range_orig) = explode('=', $_SERVER['HTTP_RANGE'], 2);

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132

} else { }

if ($size_unit == 'bytes') { //multiple ranges could be specified at the same time, but for simpl //http://tools.ietf.org/id/draft-ietf-http-range-retrieval-00.txt list($range, $extra_ranges) = explode(',', $range_orig, 2); } else { $range = ''; header('HTTP/1.1 416 Requested Range Not Satisfiable'); exit; }

$range = '';

//figure out download piece from range (if set) list($seek_start, $seek_end) = explode('-', $range, 2);

//set start and end based on range (if set), else set defaults //also check for invalid ranges. $seek_end = (empty($seek_end)) ? ($file_size - 1) : min(abs(intval($seek_end) $seek_start = (empty($seek_start) || $seek_end < abs(intval($seek_start))) ? 0 : //Only send partial content header if downloading a piece of the file (IE workaround) if ($seek_start > 0 || $seek_end < ($file_size - 1)) { header('HTTP/1.1 206 Partial Content'); header('Content-Range: bytes '.$seek_start.'-'.$seek_end.'/'.$file_size); header('Content-Length: '.($seek_end - $seek_start + 1)); } else header("Content-Length: $file_size"); header('Accept-Ranges: bytes'); set_time_limit(0); fseek($file, $seek_start); while(!feof($file)) { print(@fread($file, 1024*8)); ob_flush(); flush(); if (connection_status()!=0) { @fclose($file); exit; } } // file save was a success @fclose($file);

exit; } else {

133 } 134 else 135 { 136 137 138 139 } 140 ?>

// file couldn't be opened header("HTTP/1.0 500 Internal Server Error"); exit;

}

// file does not exist header("HTTP/1.0 404 Not Found"); exit;

You can also download it: Download PHP File Download Script

View more...

Comments

Copyright © 2017 DATENPDF Inc.