garethhall Posted March 8, 2010 Share Posted March 8, 2010 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); ?> Link to comment https://forums.phpfreaks.com/topic/194467-file-download-size-nor-passed-to-the-browser/ Share on other sites More sharing options...
garethhall Posted March 8, 2010 Author Share Posted March 8, 2010 No one knows? Link to comment https://forums.phpfreaks.com/topic/194467-file-download-size-nor-passed-to-the-browser/#findComment-1023156 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.