Jump to content

File download size nor passed to the browser


garethhall

Recommended Posts

Hi,

 

I have the code below that downloads a file. The downloads work great however the browser (I my case safari) does not show how large the file is. So in my case when downloading the download window is says "2.3MB of ? (751KB/sec)" and so on. What do I need to do the make is say "2.3MB os 23MB (750KB/sec)" ? So I need to tell the browser how big the file.

 

I was under the impression that header("Content-Length: " . $fsize); would do the job but it does not.

<?php
require_once("../includes/conn.php");
require_once("../includes/shared.php");
// Allow direct file download (hotlinking)?
// Empty - allow hotlinking
// If set to nonempty value (Example: example.com) will only allow downloads when referrer contains this text
define('ALLOWED_REFERRER', '');
// ### decode compid and fileid
$_GET['compID'] = base64_decode($_GET['compID']);
$_GET['fileID'] = base64_decode($_GET['fileID']);
if($_GET['hash']!==secret_hash("{$_GET['fileID']}/{$_GET['compID']}")) exit('404 file not found.');
// Download folder, i.e. folder where you keep all files for download.
// MUST end with slash (i.e. "/" )
/*** Get file folder name ***/
function theFolderName($id){
	$sel = "SELECT compFolder FROM comp WHERE compID =".cv($id)." LIMIT 1";
	$rs = mysql_query($sel);
	$rw = mysql_fetch_assoc($rs);
	return $rw['compFolder'];
	mysql_free_result($rs);
}
define('BASE_DIR','../ql_uploads/'.theFolderName($_GET['compID']).'/');
// log downloads?  true/false
define('LOG_DOWNLOADS',true);
// log file name
define('LOG_FILE','downloads.log');
/*************** Get all extentions and content types ***************/
// If myme type is set to empty string then script will try to detect mime type 
// itself, which would only work if you have Mimetype or Fileinfo extensions
// installed on server.
$selE = "SELECT * FROM ext";//extention from DB
$rsE = mysql_query($selE,$admin);
$allowed_ext = array ();//create array to hold extentions and content type
while($rwE = mysql_fetch_assoc($rsE) ){
$allowed_ext[substr(strrchr($rwE['ext'],'.'),1)] = $rwE['extCon'];// add to the array
}
/*** Get file information from DB ***/
function theFile($fID,$col){
$sel = "SELECT fileName,fileOrigName FROM files WHERE fileID =".cv($fID)." LIMIT 1";
$rs = mysql_query($sel);
$rw = mysql_fetch_assoc($rs);
return $rw[$col];
mysql_free_result($rs);
}
// If hotlinking not allowed then make hackers think there are some server problems
if (ALLOWED_REFERRER !== '' && (!isset($_SERVER['HTTP_REFERER']) || strpos(strtoupper($_SERVER['HTTP_REFERER']),strtoupper(ALLOWED_REFERRER)) === false)) {
  die("Internal server error. Please contact system administrator.");
}
// Make sure program execution doesn't time out
// Set maximum script execution time in seconds (0 means no limit)
set_time_limit(0);
if(!isset($_GET['fileID']) || !isset($_GET['compID']) || empty($_GET['fileID']) && empty($_GET['compID']) ){
die("Please specify file name for download.");
}
// Get real file name.
// Remove any path info to avoid hacking by adding relative path, etc.
$fname = basename(theFile($_GET['fileID'],'fileName'));
// Check if the file exists
// Check in subfolders too
function find_file ($dirname, $fname, &$file_path) {

  $dir = opendir($dirname);

  while ($file = readdir($dir)) {
    if (empty($file_path) && $file != '.' && $file != '..') {
      if (is_dir($dirname.'/'.$file)) {
        find_file($dirname.'/'.$file, $fname, $file_path);
      }
      else {
        if (file_exists($dirname.'/'.$fname)) {
          $file_path = $dirname.'/'.$fname;
          return;
        }
      }
    }
  }

} // find_file
// get full file path (including subfolders)
$file_path = '';
find_file(BASE_DIR, $fname, $file_path);
if (!is_file($file_path)) {
  die("File does not exist. Make sure you specified correct file name."); 
}
// file size in bytes
$fsize = filesize($file_path); 
// file extension
$fext = strtolower(substr(strrchr($fname,"."),1));
// check if allowed extension
if (!array_key_exists($fext, $allowed_ext)) {
  die("Not allowed file type."); 
}
// get mime type
if ($allowed_ext[$fext] == '') {
  $mtype = '';
  // mime type is not set, get from server settings
  if (function_exists('mime_content_type')) {
    $mtype = mime_content_type($file_path);
  }
  else if (function_exists('finfo_file')) {
    $finfo = finfo_open(FILEINFO_MIME); // return mime type
    $mtype = finfo_file($finfo, $file_path);
    finfo_close($finfo);  
  }
  if ($mtype == '') {
    $mtype = "application/force-download";
  }
}
else {
  // get mime type defined by admin
  $mtype = $allowed_ext[$fext];
}
// Browser will try to save file with this filename, regardless original filename.
// You can override it if needed.
if (!isset($_GET['fileID']) || empty($_GET['fileID'])) {
  $asfname = $fname;
}else{
  // remove some bad chars
  $asfname = str_replace(array('"',"'",'\\','/'), '', theFile($_GET['fileID'],'fileOrigName'));
  if ($asfname === '') $asfname = 'NoName';
}
// set headers
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $mtype");
header('Content-Type: application/octet-stream');
header("Content-Disposition: attachment; filename=\"$asfname\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fsize);
/** ############
* Download is about to begin,
* Unlock the session so other instances of this script may access session
**/
session_write_close();
// download
@readfile($file_path);
$file = @fopen($file_path,"rb");
if ($file) {
  while(!feof($file)) {
    print(fread($file, $fsize));
    flush();
if (connection_status()!=0) {
      @fclose($file);
      die();
    }
  }
  @fclose($file);
}
// log downloads
if (!LOG_DOWNLOADS) die();
$f = @fopen(LOG_FILE, 'a+');
if ($f) {
  @fputs($f, date("m.d.Y g:ia")."  ".$_SERVER['REMOTE_ADDR']."  ".$fname."\n");
  @fclose($f);
}
mysql_free_result($rsE);
?>

Archived

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

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.