Downloading problem

Hi All,

My server have php 4.7.7 config. my localhost is 5.3.0 ,.To download an audio i have taken so many php scripts from web. Its working.

  But the problem is , download will be stopped after 5 min / 7.3Mb (When i download from server) . Also i have changed php.ini file memory limit. 

Still i cant download full audio. Someone plz help!

Please take a look at the set_time_limit function

i have tried everything.

  1. ini_set()of memory limit
    2.max_time_limit
  2. set_time_limit
  3. header(Expires:0);

No change in downloading audio.

What if you download this file directly, without PHP?

if i give direrect link as HTML file it getting downloaded fully.

If i use any PHP script its not. Whether i want to change any configurations in my server ?

server config : IIS server, PHP 4.4.7

Hey Michael. If there is any problem with this tag, $_FILES array must be checked first. One should not make blind moves.
And it is much easier just to get rid of this useless field than generate it.

And I thought it is download problem, not upload.

Check the max_file_size element on the form sent to the browser. I wrote this small function to autogenerate the tag.


<?
	public static function maxFileSize()
	{
		## Set the Max post size variable.
		$postMaxSize = ini_get('post_max_size');
				
		if (stristr($postMaxSize, 'M'))
		{
			return '<input type="hidden" name="MAX_FILE_SIZE" value="'.strval(intval(str_ireplace('M', '', $postMaxSize))*1024*1024).'" />';
		}
		else if (stristr($postMaxSize, 'K'))
		{
			return '<input type="hidden" name="MAX_FILE_SIZE" value="'.strval(intval(str_ireplace('K', '', $postMaxSize))*1024).'" />';
		}
		else if (stristr($postMaxSize, 'G'))
		{
			return '<input type="hidden" name="MAX_FILE_SIZE" value="'.strval(intval(str_ireplace('G', '', $postMaxSize))*1024*1024*1024).'" />';
		}
		
		throw new Exception( 'Unable to retrieve maximum post size');
	}
?>

The function returns a tag for the maximum file size the server will accept based on the setting you have in the php.ini.
In addition to this element on the form, double check that the form tag has an encoding type attribute and is set to multipart form/data.

You are correct sir, it is a download problem, not an upload problem.

biginner, have you inspected the downloaded file?
There could be a PHP error all the way down that file.

Thanks for Reply to all.

My file is 24.5MB wma format. When i click download link , its ask to save. downloading… upto 7.3-7.5MB. Then its disconnected.My transfer rate appx 25Kb/s. When i try to play in Windows Media player it playing how much it has downloaded.

I dont think so its a Download script problem. Because i have used nearly 5 different scripts. All results the same…

Try without a script from the internet, and without anything else (at all) on your page.

E.g.


    function forceDownload($filename, $data)
    {
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="'.$filename.'"');
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Content-Length: '.strlen($data));

        if (strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE'))
        {
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Pragma: public');
        }
        else
        {
            header('Pragma: no-cache');
        }

        echo $data;
        die();
    }

Put that on a page of it’s own and try.

Aha! Misunderstood the question then.

Well, the answer is that you must send a header with the content length. Otherwise the browser will cut the connection at a random point (IE won’t start the download at all).

I am using IE only

No you aren’t. You are not every one of your visitors.

K. thanks for reply.
I am checking myside using IE. Here my code.

<?php

###############################################################
# File Download 1.3
###############################################################
# Visit http://www.zubrag.com/scripts/ for updates
###############################################################
# Sample call:
#    download.php?f=phptutorial.zip
#
# Sample call (browser will try to save with new file name):
#    download.php?f=phptutorial.zip&fc=php123tutorial.zip
###############################################################

// 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', '');

// Download folder, i.e. folder where you keep all files for download.
// MUST end with slash (i.e. "/" )
define('BASE_DIR','/home/user/downloads/');

// log downloads?  true/false
define('LOG_DOWNLOADS',true);

// log file name
define('LOG_FILE','downloads.log');

// Allowed extensions list in format 'extension' => 'mime type'
// 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.
$allowed_ext = array (

  // archives
  'zip' => 'application/zip',

  // documents
  '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'
);



####################################################################
###  DO NOT CHANGE BELOW
####################################################################

// 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['f']) || empty($_GET['f'])) {
  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($_GET['f']);

// 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['fc']) || empty($_GET['fc'])) {
  $asfname = $fname;
}
else {
  // remove some bad chars
  $asfname = str_replace(array('"',"'",'\\\\','/'), '', $_GET['fc']);
  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-Disposition: attachment; filename=\\"$asfname\\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fsize);

// download
// @readfile($file_path);
$file = @fopen($file_path,"rb");
if ($file) {
  while(!feof($file)) {
    print(fread($file, 1024*8));
    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."\
");
  @fclose($f);
}

?>

I am calculating size also. But still its not working.

Use file_put_contents to create a log file and then insert calls to the function to log what’s going on. I’m guessing PHP is encountering a fatal error after the headers are sent but before the outgoing stream begins, causing you to be unable to see your error message.

Your webserver might be killing the php process because it runs for such a long time. Is the time until failure consistent?

I have used File_put_contents(). This log file will be created once download completes. I i cant get any information bec download ll be stopped in particular limit

Yes. It will be consistent till failure.
My webserver is IIS 6. and i found some ideas here,

Timeouts after five minutes with IIS on Windows can be caused by an
inherited CGI Timeout value of 300 seconds. This is not a PHP problem.

[edit]
Solution

[edit]
IIS 6

>From Jinzora Forums:

* You'll need to get the IIS 6.0 Resource Kit Tools.
* Install the Resource Kit.
* Go to Start, Programs, IIS Resources, Metabase Explorer, Metabase 

Explorer.
* Open ‘LM’.
* Open ‘W3SVC’.
* Find ‘CGITimeout’ in the name category (sorting by name helps).
* It will probably have 300 (5 minutes) as the value for the data
column. Double click and change it to your liking (7200 is 2 hours
which will work best if you have long DJ mixes to stream, or entire
albums condensed to a single mp3).
* Restart your web site through the IIS Manager.
* Enjoy songs for more then 5 minutes!

SOLUTION:

  1. Open IIS Manager.
  2. Right click ____ (local computer) and select properties.
  3. Select “Enable Direct Metabase Edit”
  4. From the start menu select IIS Resources then the Metabase Explorer.
  5. expand ____ (local) tab.
  6. Select W3SVC
  7. Change the CGITimeout value by double clicking it.
    Cool Finally go back to IIS Manager and uncheck the “Enable Direct
    Metabase Edit” check box.

Is it will work?Is it Correct Solution ? Please Suggest…

Still i didnt get any solution. Friends, If u know plz Suggest…

What results do you get from post #6 and [url=“http://www.sitepoint.com/forums/showpost.php?p=4515408&postcount=10”]post #10