2017-02-01 23:20:47 +01:00
< ? php
class VinylDownload {
const MAXDOWNLOADS = 3 ;
const TABLE = 'vinyl-codes' ;
public $database , $file , $code ;
public function __construct () {
2017-02-02 17:39:50 +01:00
// @set_time_limit(0);
// ini_set('memory_limit', '512M');
2017-02-01 23:20:47 +01:00
}
private function db_connect (){
$db = new SQLite3 ( $this -> database );
if ( ! $db ) die ( $error );
return $db ;
}
public function query_code ( $code ) {
$db = $this -> db_connect ();
$c = SQLite3 :: escapeString ( $code ) ;
$q = " SELECT * FROM ' " . self :: TABLE . " ' WHERE code=' " . $c . " ' " ;
$result = @ $db -> query ( $q );
$row = @ $result -> fetchArray ();
$db -> close ();
// row == false when no row was found
return $row ;
}
private function increase_count_in_db () {
$db = @ $this -> db_connect ();
$db -> exec ( " UPDATE ' " . self :: TABLE . " ' SET count = count + 1 WHERE code=' " . $this -> code . " ' " );
$db -> close ();
}
public function reached_max_dl ( $count ) {
$max = false ;
$count += 1 ;
if ( $count > self :: MAXDOWNLOADS ) $max = true ;
return $max ;
}
public function gen_response ( $c , $f ){
$this -> code = $c ;
$content = " Code ungültig oder abgelaufen. " ;
// row == false when no row was found
if ( $row = $this -> query_code ( $this -> code ) ) {
// max count not reached
if ( false === $this -> reached_max_dl ( $row [ 'count' ] ) ) {
$content = '
< div id = " 1 " >
< form method = POST id = " dl-trigger " action = " https://www.rainervonvielen.de/digital-download " >< p >
2017-02-02 17:39:50 +01:00
< input type = " hidden " value = " '. $this->code . ' " name = " c " >
< input type = " hidden " value = " '. $f . ' " name = " sel_format " >
< input type = " submit " class = " btn middle " value= " Start " >
2017-02-01 23:20:47 +01:00
</ form >
</ div >
< script >
jQuery ( " #dl-trigger " ) . submit ( function ( e ) {
2017-02-02 17:39:50 +01:00
jQuery ( " #1 " ) . html ( " <p><strong>Download ist gestartet.</strong> Du hast noch <strong>' . ( self::MAXDOWNLOADS - $row['count'] - 1 ) .'</strong> Downloads zur Verfügung bis der Code ungültig wird. " );
2017-02-01 23:20:47 +01:00
});
2017-02-02 17:39:50 +01:00
return true ;
2017-02-01 23:20:47 +01:00
</ script >
' ;
}
}
return $content ;
}
public function dl_trigger ( $format ) {
// Start Download
switch ( $format ) {
case 'mp3' :
$file = $this -> mp3_file ;
2017-02-02 17:39:50 +01:00
$filename = " Rainer_von_Vielen-Überall_Chaos_2017-MP3.zip " ;
2017-02-01 23:20:47 +01:00
break ;
case 'wav' :
$file = $this -> wav_file ;
2017-02-02 17:39:50 +01:00
$filename = " Rainer_von_Vielen-Überall_Chaos_2017-WAV.zip " ;
2017-02-01 23:20:47 +01:00
break ;
}
$this -> downloader ( $file , $filename );
$this -> increase_count_in_db ();
}
private function downloader ( $file , $filename ){
// Force the browser to start the download automatically
// Variables:
// $file = real name of actual download file on the server
// $filename = new name of local download file - this is what the visitor's file will actually be called when he/she saves it
ob_start ();
2017-02-02 17:39:50 +01:00
header ( " Content-Type: application/octet-stream " );
header ( " Content-Disposition: attachment; filename= " . $filename . " " );
2017-02-01 23:20:47 +01:00
header ( " Content-Description: File Transfer " );
header ( " Content-Length: " . ( string )( filesize ( $file )) );
header ( " Cache-Control: public, must-revalidate " );
header ( " Pragma: public " );
header ( " Content-Transfer-Encoding: binary \n " );
ob_end_clean ();
readfile ( $file );
}
/*
* Nicht benoetigt ::
*/
private function downloader_large_file ( $filePath )
{
if ( ! empty ( $filePath )){
$fileInfo = pathinfo ( $filePath );
$fileName = $fileInfo [ 'basename' ];
$fileExtnesion = $fileInfo [ 'extension' ];
$default_contentType = " application/octet-stream " ;
$content_types_list = $this -> mimeTypes ();
// to find and use specific content type, check out this IANA page : http://www.iana.org/assignments/media-types/media-types.xhtml
if ( array_key_exists ( $fileExtnesion , $content_types_list )) {
$contentType = $content_types_list [ $fileExtnesion ];
} else {
$contentType = $default_contentType ;
}
if ( file_exists ( $filePath )) {
$size = filesize ( $filePath );
$offset = 0 ;
$length = $size ;
//HEADERS FOR PARTIAL DOWNLOAD FACILITY BEGINS
if ( isset ( $_SERVER [ 'HTTP_RANGE' ] ) ) {
preg_match ( '/bytes=(\d+)-(\d+)?/' , $_SERVER [ 'HTTP_RANGE' ], $matches );
$offset = intval ( $matches [ 1 ]);
$length = intval ( $matches [ 2 ]) - $offset ;
$fhandle = fopen ( $filePath , 'r' );
fseek ( $fhandle , $offset ); // seek to the requested offset, this is 0 if it's not a partial content request
$data = fread ( $fhandle , $length );
fclose ( $fhandle );
header ( 'HTTP/1.1 206 Partial Content' );
header ( 'Content-Range: bytes ' . $offset . '-' . ( $offset + $length ) . '/' . $size );
} //HEADERS FOR PARTIAL DOWNLOAD FACILITY BEGINS
//USUAL HEADERS FOR DOWNLOAD
header ( " Content-Disposition: attachment;filename= " . $fileName );
header ( 'Content-Type: ' . $contentType );
header ( " Accept-Ranges: bytes " );
header ( " Pragma: public " );
header ( " Expires: -1 " );
header ( " Cache-Control: no-cache " );
header ( " Cache-Control: public, must-revalidate, post-check=0, pre-check=0 " );
header ( " Content-Length: " . filesize ( $filePath ));
$chunksize = 8 * ( 1024 * 1024 ); //8MB (highest possible fread length)
if ( $size > $chunksize ){
$handle = fopen ( $_FILES [ " file " ][ " tmp_name " ], 'rb' );
$buffer = '' ;
while ( ! feof ( $handle ) && ( connection_status () === CONNECTION_NORMAL ))
{
$buffer = fread ( $handle , $chunksize );
print $buffer ;
ob_flush ();
flush ();
}
if ( connection_status () !== CONNECTION_NORMAL ){
echo " Connection aborted " ;
}
fclose ( $handle );
} else {
ob_clean ();
flush ();
readfile ( $filePath );
}
} else {
echo 'File does not exist!' ;
}
} else {
echo 'There is no file to download!' ;
}
}
/* Function to get correct MIME type for download */
private function mimeTypes ( $defaultType = null )
{
/* Just add any required MIME type if you are going to download something not listed here.*/
$mime_types = array ( " 323 " => " text/h323 " ,
" acx " => " application/internet-property-stream " ,
" ai " => " application/postscript " ,
" aif " => " audio/x-aiff " ,
" aifc " => " audio/x-aiff " ,
" aiff " => " audio/x-aiff " ,
" asf " => " video/x-ms-asf " ,
" asr " => " video/x-ms-asf " ,
" asx " => " video/x-ms-asf " ,
" au " => " audio/basic " ,
" avi " => " video/x-msvideo " ,
" axs " => " application/olescript " ,
" bas " => " text/plain " ,
" bcpio " => " application/x-bcpio " ,
" bin " => " application/octet-stream " ,
" bmp " => " image/bmp " ,
" c " => " text/plain " ,
" cat " => " application/vnd.ms-pkiseccat " ,
" cdf " => " application/x-cdf " ,
" cer " => " application/x-x509-ca-cert " ,
" class " => " application/octet-stream " ,
" clp " => " application/x-msclip " ,
" cmx " => " image/x-cmx " ,
" cod " => " image/cis-cod " ,
" cpio " => " application/x-cpio " ,
" crd " => " application/x-mscardfile " ,
" crl " => " application/pkix-crl " ,
" crt " => " application/x-x509-ca-cert " ,
" csh " => " application/x-csh " ,
" css " => " text/css " ,
" dcr " => " application/x-director " ,
" der " => " application/x-x509-ca-cert " ,
" dir " => " application/x-director " ,
" dll " => " application/x-msdownload " ,
" dms " => " application/octet-stream " ,
" doc " => " application/msword " ,
" dot " => " application/msword " ,
" dvi " => " application/x-dvi " ,
" dxr " => " application/x-director " ,
" eps " => " application/postscript " ,
" etx " => " text/x-setext " ,
" evy " => " application/envoy " ,
" exe " => " application/octet-stream " ,
" fif " => " application/fractals " ,
" flr " => " x-world/x-vrml " ,
" gif " => " image/gif " ,
" gtar " => " application/x-gtar " ,
" gz " => " application/x-gzip " ,
" h " => " text/plain " ,
" hdf " => " application/x-hdf " ,
" hlp " => " application/winhlp " ,
" hqx " => " application/mac-binhex40 " ,
" hta " => " application/hta " ,
" htc " => " text/x-component " ,
" htm " => " text/html " ,
" html " => " text/html " ,
" htt " => " text/webviewhtml " ,
" ico " => " image/x-icon " ,
" ief " => " image/ief " ,
" iii " => " application/x-iphone " ,
" ins " => " application/x-internet-signup " ,
" isp " => " application/x-internet-signup " ,
" jfif " => " image/pipeg " ,
" jpe " => " image/jpeg " ,
" jpeg " => " image/jpeg " ,
" jpg " => " image/jpeg " ,
" js " => " application/x-javascript " ,
" latex " => " application/x-latex " ,
" lha " => " application/octet-stream " ,
" lsf " => " video/x-la-asf " ,
" lsx " => " video/x-la-asf " ,
" lzh " => " application/octet-stream " ,
" m13 " => " application/x-msmediaview " ,
" m14 " => " application/x-msmediaview " ,
" m3u " => " audio/x-mpegurl " ,
" man " => " application/x-troff-man " ,
" mdb " => " application/x-msaccess " ,
" me " => " application/x-troff-me " ,
" mht " => " message/rfc822 " ,
" mhtml " => " message/rfc822 " ,
" mid " => " audio/mid " ,
" mny " => " application/x-msmoney " ,
" mov " => " video/quicktime " ,
" movie " => " video/x-sgi-movie " ,
" mp2 " => " video/mpeg " ,
" mp3 " => " audio/mpeg " ,
" mpa " => " video/mpeg " ,
" mpe " => " video/mpeg " ,
" mpeg " => " video/mpeg " ,
" mpg " => " video/mpeg " ,
" mpp " => " application/vnd.ms-project " ,
" mpv2 " => " video/mpeg " ,
" ms " => " application/x-troff-ms " ,
" mvb " => " application/x-msmediaview " ,
" nws " => " message/rfc822 " ,
" oda " => " application/oda " ,
" p10 " => " application/pkcs10 " ,
" p12 " => " application/x-pkcs12 " ,
" p7b " => " application/x-pkcs7-certificates " ,
" p7c " => " application/x-pkcs7-mime " ,
" p7m " => " application/x-pkcs7-mime " ,
" p7r " => " application/x-pkcs7-certreqresp " ,
" p7s " => " application/x-pkcs7-signature " ,
" pbm " => " image/x-portable-bitmap " ,
" pdf " => " application/pdf " ,
" pfx " => " application/x-pkcs12 " ,
" pgm " => " image/x-portable-graymap " ,
" pko " => " application/ynd.ms-pkipko " ,
" pma " => " application/x-perfmon " ,
" pmc " => " application/x-perfmon " ,
" pml " => " application/x-perfmon " ,
" pmr " => " application/x-perfmon " ,
" pmw " => " application/x-perfmon " ,
" pnm " => " image/x-portable-anymap " ,
" pot " => " application/vnd.ms-powerpoint " ,
" ppm " => " image/x-portable-pixmap " ,
" pps " => " application/vnd.ms-powerpoint " ,
" ppt " => " application/vnd.ms-powerpoint " ,
" prf " => " application/pics-rules " ,
" ps " => " application/postscript " ,
" pub " => " application/x-mspublisher " ,
" qt " => " video/quicktime " ,
" ra " => " audio/x-pn-realaudio " ,
" ram " => " audio/x-pn-realaudio " ,
" ras " => " image/x-cmu-raster " ,
" rgb " => " image/x-rgb " ,
" rmi " => " audio/mid " ,
" roff " => " application/x-troff " ,
" rtf " => " application/rtf " ,
" rtx " => " text/richtext " ,
" scd " => " application/x-msschedule " ,
" sct " => " text/scriptlet " ,
" setpay " => " application/set-payment-initiation " ,
" setreg " => " application/set-registration-initiation " ,
" sh " => " application/x-sh " ,
" shar " => " application/x-shar " ,
" sit " => " application/x-stuffit " ,
" snd " => " audio/basic " ,
" spc " => " application/x-pkcs7-certificates " ,
" spl " => " application/futuresplash " ,
" src " => " application/x-wais-source " ,
" sst " => " application/vnd.ms-pkicertstore " ,
" stl " => " application/vnd.ms-pkistl " ,
" stm " => " text/html " ,
" svg " => " image/svg+xml " ,
" sv4cpio " => " application/x-sv4cpio " ,
" sv4crc " => " application/x-sv4crc " ,
" t " => " application/x-troff " ,
" tar " => " application/x-tar " ,
" tcl " => " application/x-tcl " ,
" tex " => " application/x-tex " ,
" texi " => " application/x-texinfo " ,
" texinfo " => " application/x-texinfo " ,
" tgz " => " application/x-compressed " ,
" tif " => " image/tiff " ,
" tiff " => " image/tiff " ,
" tr " => " application/x-troff " ,
" trm " => " application/x-msterminal " ,
" tsv " => " text/tab-separated-values " ,
" txt " => " text/plain " ,
" uls " => " text/iuls " ,
" ustar " => " application/x-ustar " ,
" vcf " => " text/x-vcard " ,
" vrml " => " x-world/x-vrml " ,
" wav " => " audio/x-wav " ,
" wcm " => " application/vnd.ms-works " ,
" wdb " => " application/vnd.ms-works " ,
" wks " => " application/vnd.ms-works " ,
" wmf " => " application/x-msmetafile " ,
" wps " => " application/vnd.ms-works " ,
" wri " => " application/x-mswrite " ,
" wrl " => " x-world/x-vrml " ,
" wrz " => " x-world/x-vrml " ,
" xaf " => " x-world/x-vrml " ,
" xbm " => " image/x-xbitmap " ,
" xla " => " application/vnd.ms-excel " ,
" xlc " => " application/vnd.ms-excel " ,
" xlm " => " application/vnd.ms-excel " ,
" xls " => " application/vnd.ms-excel " ,
" xlt " => " application/vnd.ms-excel " ,
" xlw " => " application/vnd.ms-excel " ,
" xof " => " x-world/x-vrml " ,
" xpm " => " image/x-xpixmap " ,
" xwd " => " image/x-xwindowdump " ,
" z " => " application/x-compress " ,
" rar " => " application/x-rar-compressed " ,
" zip " => " application/zip " );
return $mime_types ;
}
}
?>