I got this code that secure the download links but got no resume capability,
can sombody help me to add resume code on this script?
This is the script:
- download.php
<?php /* |----------------- | Chip Error Manipulation |------------------ */ error_reporting(-1); /* |----------------- | Chip Constant Manipulation |------------------ */ define( "CHIP_DEMO_FSROOT", __DIR__ . "/" ); /* |----------------- | Chip Download Class |------------------ */ require_once("class.chip_download.php"); /* |----------------- | Class Instance |------------------ */ $download_path = CHIP_DEMO_FSROOT . "downloadfiles/"; $file = $_REQUEST['f']; $args = array( 'download_path' => $download_path, 'file' => $file, 'extension_check' => TRUE, 'referrer_check' => FALSE, 'referrer' => NULL, ); $download = new chip_download( $args ); /* |----------------- | Pre Download Hook |------------------ */ $download_hook = $download->get_download_hook(); //$download->chip_print($download_hook); //exit; /* |----------------- | Download |------------------ */ if( $download_hook['download'] == TRUE ) { /* You can write your logic before proceeding to download */ /* Let's download file */ $download->get_download(); } ?>
2.class.chip_download.php
<?php class chip_download { /* |--------------------------- | Properties |--------------------------- */ private $download_hook = array(); private $args = array( 'download_path' => NULL, 'file' => NULL, 'extension_check' => TRUE, 'referrer_check' => FALSE, 'referrer' => NULL, ); private $allowed_extensions = array( /* Archives */ 'zip' => 'application/zip', 'rar' => 'application/rar', '7z' => 'application/octet-stream', /* Documents */ 'txt' => 'text/plain', 'pdf' => 'application/pdf', 'doc' => 'application/msword', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', /* Executables */ 'exe' => 'application/octet-stream', /* Images */ 'gif' => 'image/gif', 'png' => 'image/png', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', /* Audio */ 'mp3' => 'audio/mpeg', 'wav' => 'audio/x-wav', /* Video */ 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpe' => 'video/mpeg', 'mov' => 'video/quicktime', 'avi' => 'video/x-msvideo' ); /* |--------------------------- | Constructor | | @public | @param array $args | @param array $allowed_extensions | |--------------------------- */ public function __construct( $args = array(), $allowed_extensions = array() ) { $this->set_args( $args ); $this->set_allowed_extensions( $allowed_extensions ); } /* |--------------------------- | Print variable in readable format | | @public | @param string|array|object $var | |--------------------------- */ public function chip_print( $var ) { echo "";
print_r($var);
echo "";
}
/*
|---------------------------
| Update default arguments
| It will update default array of class i.e $args
|
| @private
| @param array $args - input arguments
| @param array $defatuls - default arguments
| @return array
|
|---------------------------
*/
private function chip_parse_args( $args = array(), $defaults = array() ) {
return array_merge( $defaults, $args );
}
/*
|---------------------------
| Get extension and name of file
|
| @private
| @param string $file_name
| @return array - having file_name and file_ext
|
|---------------------------
*/
private function chip_extension($file_name) {
$temp = array();
$temp['file_name'] = strtolower( substr( $file_name, 0, strripos( $file_name, '.' ) ) );
$temp['file_extension'] = strtolower( substr( $file_name, strripos( $file_name, '.' ) + 1 ) );
return $temp;
}
/*
|---------------------------
| Set default arguments
| It will set default array of class i.e $args
|
| @private
| @param array $args
| @return 0
|
|---------------------------
*/
private function set_args( $args = array() ) {
$defaults = $this->get_args();
$args = $this->chip_parse_args( $args, $defaults );
$this->args = $args;
}
/*
|---------------------------
| Get default arguments
| It will get default array of class i.e $args
|
| @public
| @return array
|
|---------------------------
*/
public function get_args() {
return $this->args;
}
/*
|---------------------------
| Set default allowed extensions
| It will set default array of class i.e $allowed_extensions
|
| @private
| @param array $allowed_extensions
| @return 0
|
|---------------------------
*/
private function set_allowed_extensions( $allowed_extensions = array() ) {
$defaults = $this->get_allowed_extensions();
$allowed_extensions = array_unique( $this->chip_parse_args( $allowed_extensions, $defaults ) );
$this->allowed_extensions = $allowed_extensions;
}
/*
|---------------------------
| Get default allowed extensions
| It will get default array of class i.e $allowed_extensions
|
| @public
| @return array
|
|---------------------------
*/
public function get_allowed_extensions() {
return $this->allowed_extensions;
}
/*
|---------------------------
| Set Mimi Type
| It will set default array of class i.e $allowed_extensions
|
| @private
| @param string $file_path
! @return string
|
|---------------------------
*/
private function set_mime_type( $file_path ) {
/* by Function - mime_content_type */
if( function_exists( 'mime_content_type' ) ) {
$file_mime_type = @mime_content_type( $file_path );
}
/* by Function - mime_content_type */
else if( function_exists( 'finfo_file' ) ) {
$finfo = @finfo_open(FILEINFO_MIME);
$file_mime_type = @finfo_file($finfo, $file_path);
finfo_close($finfo);
}
/* Default - FALSE */
else {
$file_mime_type = FALSE;
}
return $file_mime_type;
}
/*
|---------------------------
| Get Mimi Type
| It will set default array of class i.e $allowed_extensions
|
| @public
| @param string $file_path
! @return string
|
|---------------------------
*/
public function get_mime_type( $file_path ) {
return $this->set_mime_type( $file_path );
}
/*
|---------------------------
| Pre Download Hook
|
| @private
| @return 0
|
|---------------------------
*/
private function set_download_hook() {
/* Allowed Extensions */
$allowed_extensions = $this->get_allowed_extensions();
/* Arguments */
$args = $this->get_args();
/* Extract Arguments */
extract($args);
/* Directory Depth */
$dir_depth = dirname( $file );
if ( !empty( $dir_depth ) && $dir_depth != "." ) {
$download_path = $download_path . $dir_depth . "/";
}
/* File Name */
$file = basename( $file );
/* File Path */
$file_path = $download_path . $file;
$this->download_hook['file_path'] = $file_path;
/* File and File Path Validation */
if( empty( $file ) || !file_exists( $file_path ) ) {
$this->download_hook['download'] = FALSE;
$this->download_hook['message'] = "Invalid File or File Path.";
return 0;
}
/* File Name and Extension */
$nameext = $this->chip_extension($file);
$file_name = $nameext['file_name'];
$file_extension = $nameext['file_extension'];
$this->download_hook['file'] = $file;
$this->download_hook['file_name'] = $file_name;
$this->download_hook['file_extension'] = $file_extension;
/* Allowed Extension - Validation */
if ( $extension_check == TRUE && !array_key_exists( $file_extension, $allowed_extensions ) ) {
$this->download_hook['download'] = FALSE;
$this->download_hook['message'] = "File is not allowed to download";
return 0;
}
/* Referrer - Validation */
if ( $referrer_check == TRUE && !empty($referrer) && strpos( strtoupper( $_SERVER['HTTP_REFERER'] ), strtoupper( $referrer ) ) === FALSE ) {
$this->download_hook['download'] = FALSE;
$this->download_hook['message'] = "Internal server error - Please contact system administrator";
return 0;
}
/* File Size in Bytes */
$file_size = filesize($file_path);
$this->download_hook['file_size'] = $file_size;
/* File Mime Type - Auto, Manual, Default */
$file_mime_type = $this->get_mime_type( $file_path );
if( empty( $file_mime_type ) ) {
$file_mime_type = $allowed_extensions[$file_extension];
if( empty( $file_mime_type ) ) {
$file_mime_type = "application/force-download";
}
}
$this->download_hook['file_mime_type'] = $file_mime_type;
$this->download_hook['download'] = TRUE;
$this->download_hook['message'] = "File is ready to download";
return 0;
}
/*
|---------------------------
| Download Hook
| Allows you to do some action before download
|
| @public
| @return array
|
|---------------------------
*/
public function get_download_hook() {
$this->set_download_hook();
return $this->download_hook;
}
/*
|---------------------------
| Post Download Hook
|
| @private
| @return array
|
|---------------------------
*/
private function set_post_download_hook() {
return $this->download_hook;
}
/*
|---------------------------
| Download
| Start download stream
|
| @public
| @return 0
|
|---------------------------
*/
public function set_download() {
/* Download Hook */
$download_hook = $this->set_post_download_hook();
/* Extract */
extract($download_hook);
/* Recheck */
if( $download_hook['download'] != TRUE ) {
echo "File is not allowed to download";
return 0;
}
/* Execution Time Unlimited */
set_time_limit(0);
/*
|----------------
| Header
| Forcing a download using readfile()
|----------------
*/
header('Content-Description: File Transfer');
header('Content-Type: ' . $file_mime_type);
header('Content-Disposition: attachment; filename=' . $file);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . $file_size);
ob_clean();
flush();
readfile($file_path);
exit;
}
/*
|---------------------------
| Download
| Start download stream
|
| @public
| @return array
|
|---------------------------
*/
public function get_download() {
$this->set_download();
exit;
}
/*
|---------------------------
| Destructor
|---------------------------
*/
public function __destruct() {
}
}
?>
Thanks in advance.