Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

Downloadable files


Time Punk

Recommended Posts

Posted

I got the downloadable files system working but instead of being able to download files in their original name eg. video1.mp4 , the files can be downloaded as "download.php".

I guess the error is in download.php itself ? Or somewhere else ?

Payments are through Paypal and redirect is turned off.

Thanks for any help :)

Here is the download.php code:

 

<?php

/*

$Id: download.php,v 1.9 2003/02/13 03:01:48 hpdl Exp $

 

osCommerce, Open Source E-Commerce Solutions

http://www.oscommerce.com

 

Copyright © 2003 osCommerce

 

Released under the GNU General Public License

*/

 

include('includes/application_top.php');

 

if (!tep_session_is_registered('customer_id')) die;

 

// Check download.php was called with proper GET parameters

if ((isset($HTTP_GET_VARS['order']) && !is_numeric($HTTP_GET_VARS['order'])) || (isset($HTTP_GET_VARS['id']) && !is_numeric($HTTP_GET_VARS['id'])) ) {

die;

}

 

// Check that order_id, customer_id and filename match

$downloads_query = tep_db_query("select date_format(o.date_purchased, '%Y-%m-%d') as date_purchased_day, opd.download_maxdays, opd.download_count, opd.download_maxdays, opd.orders_products_filename from " . TABLE_ORDERS . " o, " . TABLE_ORDERS_PRODUCTS . " op, " . TABLE_ORDERS_PRODUCTS_DOWNLOAD . " opd where o.customers_id = '" . $customer_id . "' and o.orders_id = '" . (int)$HTTP_GET_VARS['order'] . "' and o.orders_id = op.orders_id and op.orders_products_id = opd.orders_products_id and opd.orders_products_download_id = '" . (int)$HTTP_GET_VARS['id'] . "' and opd.orders_products_filename != ''");

if (!tep_db_num_rows($downloads_query)) die;

$downloads = tep_db_fetch_array($downloads_query);

// MySQL 3.22 does not have INTERVAL

list($dt_year, $dt_month, $dt_day) = explode('-', $downloads['date_purchased_day']);

$download_timestamp = mktime(23, 59, 59, $dt_month, $dt_day + $downloads['download_maxdays'], $dt_year);

 

// Die if time expired (maxdays = 0 means no time limit)

if (($downloads['download_maxdays'] != 0) && ($download_timestamp <= time())) die;

// Die if remaining count is <=0

if ($downloads['download_count'] <= 0) die;

// Die if file is not there

if (!file_exists(DIR_FS_DOWNLOAD . $downloads['orders_products_filename'])) die;

 

// Now decrement counter

tep_db_query("update " . TABLE_ORDERS_PRODUCTS_DOWNLOAD . " set download_count = download_count-1 where orders_products_download_id = '" . (int)$HTTP_GET_VARS['id'] . "'");

 

// Returns a random name, 16 to 20 characters long

// There are more than 10^28 combinations

// The directory is "hidden", i.e. starts with '.'

function tep_random_name()

{

$letters = 'abcdefghijklmnopqrstuvwxyz';

$dirname = '.';

$length = floor(tep_rand(16,20));

for ($i = 1; $i <= $length; $i++) {

$q = floor(tep_rand(1,26));

$dirname .= $letters[$q];

}

return $dirname;

}

 

// Unlinks all subdirectories and files in $dir

// Works only on one subdir level, will not recurse

function tep_unlink_temp_dir($dir)

{

$h1 = opendir($dir);

while ($subdir = readdir($h1)) {

// Ignore non directories

if (!is_dir($dir . $subdir)) continue;

// Ignore . and .. and CVS

if ($subdir == '.' || $subdir == '..' || $subdir == 'CVS') continue;

// Loop and unlink files in subdirectory

$h2 = opendir($dir . $subdir);

while ($file = readdir($h2)) {

if ($file == '.' || $file == '..') continue;

@unlink($dir . $subdir . '/' . $file);

}

closedir($h2);

@rmdir($dir . $subdir);

}

closedir($h1);

}

 

 

// Now send the file with header() magic

/* header("Expires: Mon, 26 Nov 1962 00:00:00 GMT");

header("Last-Modified: " . gmdate("D,d M Y H:i:s") . " GMT");

header("Cache-Control: no-cache, must-revalidate");

header("Pragma: no-cache");

header("Content-Type: Application/octet-stream");

header("Content-disposition: attachment; filename=" . $downloads['orders_products_filename']);

*/

 

$fpath = "downloads/".$downloads['orders_products_filename'];

$fsize = filesize($fpath);

$bufsize = 20000;

 

if(strstr($_SERVER[HTTP_USER_AGENT],"MSIE")) {

$fname=str_replace("+"," ",urlencode($fname));

}

 

if(isset($_SERVER['HTTP_RANGE'])) {//Partial download

if(preg_match("/^bytes=(\\d+)-(\\d*)$/", $_SERVER['HTTP_RANGE'], $matches)) { //parsing Range header

$from = $matches[1];

$to = $matches[2];

if(empty($to)) {

$to = $fsize - 1; // -1 because end byte is included

//(From HTTP protocol:

// 'The last-byte-pos value gives the byte-offset of the last byte in the range; that is, the byte positions specified are inclusive')

}

$content_size = $to - $from + 1;

header("HTTP/1.1 206 Partial Content");

header("Content-Range: $from-$to/$fsize");

header("Content-Length: $content_size");

header("Content-Type: application/octet-stream");

header("Content-Disposition: attachment; filename=$fname");

header("Content-Transfer-Encoding: binary");

 

if(file_exists($fpath) && $fh = fopen($fpath, "rb")) {

fseek($fh, $from);

$cur_pos = ftell($fh);

while($cur_pos !== FALSE && ftell($fh) + $bufsize < $to+1) {

$buffer = fread($fh, $bufsize);

print $buffer;

$cur_pos = ftell($fh);

}

 

$buffer = fread($fh, $to+1 - $cur_pos);

print $buffer;

fclose($fh);

 

} else {

header("HTTP/1.1 404 Not Found");

exit;

}

} else {

header("HTTP/1.1 500 Internal Server Error");

exit;

}

} else { // Usual download

header("HTTP/1.1 200 OK");

header("Content-Length: $fsize");

header("Content-Type: application/octet-stream");

header("Content-Disposition: attachment; filename=$fname");

header("Content-Transfer-Encoding: binary");

 

if(file_exists($fpath) && $fh = fopen($fpath, "rb")) {

while($buf = fread($fh, $bufsize))

print $buf;

 

fclose($fh);

} else {

header("HTTP/1.1 404 Not Found");

}

}

 

if (DOWNLOAD_BY_REDIRECT == 'true') {

// This will work only on Unix/Linux hosts

tep_unlink_temp_dir(DIR_FS_DOWNLOAD_PUBLIC);

$tempdir = tep_random_name();

umask(0000);

mkdir(DIR_FS_DOWNLOAD_PUBLIC . $tempdir, 0777);

symlink(DIR_FS_DOWNLOAD . $downloads['orders_products_filename'], DIR_FS_DOWNLOAD_PUBLIC . $tempdir . '/' . $downloads['orders_products_filename']);

tep_redirect(DIR_WS_DOWNLOAD_PUBLIC . $tempdir . '/' . $downloads['orders_products_filename']);

} else {

// This will work on all systems, but will need considerable resources

// We could also loop with fread($fp, 4096) to save memory

readfile(DIR_FS_DOWNLOAD . $downloads['orders_products_filename']);

}

?>

Posted

Forgot to mention my other settings.

 

Download : true

Redirect : false

 

download.php CHMOD 0-7-7-7

downloadfolder CHMOD 0-7-7-7

 

Any other settings that I should have done ?

Posted

Thanks, I changed to 7-7-7 using my ftp program.

 

Now I got this error message while trying to download:

 

ce in /data/10/1/30/125/1030940/user/1061587/htdocs/download.php on line 60

 

Warning: closedir(): supplied argument is not a valid Directory resource in /data/10/1/30/125/1030940/user/1061587/htdocs/download.php on line 74

 

Warning: mkdir(/data/10/1/30/125/1030940/user/1061587//./cgi-bin/pub/.npegywvmboggecdfhhr): No such file or directory in /data/10/1/30/125/1030940/user/1061587/htdocs/download.php on line 155

 

Warning: symlink(): No such file or directory in /data/10/1/30/125/1030940/user/1061587/htdocs/download.php on line 156

 

Warning: Cannot modify header information - headers already sent by (output started at /data/10/1/30/125/1030940/user/1061587/htdocs/download.php:156) in /data/10/1/30/125/1030940/user/1061587/htdocs/includes/functions/general.php on line 33

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...