Jump to content

Force Dowload in Browser Issue


random1

Recommended Posts

I am troubleshooting an issue with following code for an issue with the download file name.

 

It tries to save the file as '.database_full_backup-2009-06-05-1244173623.sql.'

 

I'm giving it the file: database_full_backup-2009-06-05-1244173623.sql

 

It does donwload the correct data and is the correct size too but the filename is mangled.

 

Screenshot: http://www.imagebam.com/image/321fc837980549

 

Where are the beginning '. and ending .' coming from?

 

Really frustrating! Please lay down some knowledge. :D

 

<?php

// Source: http://w-shadow.com/blog/2007/08/12/how-to-force-file-download-with-php/

function output_file($file, $name, $mime_type = '')
{
/*
This function takes a path to a file to output ($file), 
the filename that the browser will see ($name) and 
the MIME type of the file ($mime_type, optional).

If you want to do something on download abort/finish,
register_shutdown_function('function_name');
*/
if(!is_readable($file)) die('File ' . $file . ' not found or inaccessible!');

$size = filesize($file);
$name = rawurldecode($name);

/* Figure out the MIME type (if not specified) */
$known_mime_types=array(
	'pdf' => 'application/pdf',
	'txt' => 'text/plain',
	'vcf' => 'text/x-vcard',
	'sql' => 'application/x-sql',
	'html' => 'text/html',
	'htm' => 'text/html',
	'exe' => 'application/octet-stream',
	'zip' => 'application/zip',
	'doc' => 'application/msword',
	'xls' => 'application/vnd.ms-excel',
	'ppt' => 'application/vnd.ms-powerpoint',
	'gif' => 'image/gif',
	'png' => 'image/png',
	'jpeg'=> 'image/jpg',
	'jpg' =>  'image/jpg',
	'php' => 'text/plain');

	if($mime_type==''){
		$file_extension = strtolower(substr(strrchr($file,'.'),1));

		if(array_key_exists($file_extension, $known_mime_types)){
			$mime_type=$known_mime_types[$file_extension];
		}
		else
		{
			$mime_type='application/force-download';
		};
	};

@ob_end_clean(); //turn off output buffering to decrease cpu usage

// required for IE, otherwise Content-Disposition may be ignored
if(ini_get('zlib.output_compression'))
	ini_set('zlib.output_compression', 'Off');
	header('Content-Type: ' . $mime_type);
	header("Content-Disposition: attachment; filename='.$name.'");
	header('Content-Transfer-Encoding: binary');
	header('Accept-Ranges: bytes');

/* The three lines below basically make the 
    download non-cacheable */
	header('Cache-control: private');
	header('Pragma: private');
	header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');

// multipart-download and download resuming support
	if(isset($_SERVER['HTTP_RANGE']))
	{
		list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
		list($range) = explode(",",$range,2);
		list($range, $range_end) = explode("-", $range);
		$range=intval($range);
		if(!$range_end) {
			$range_end=$size-1;
		}
		else
		{
			$range_end=intval($range_end);
		}

	$new_length = $range_end-$range+1;
	header("HTTP/1.1 206 Partial Content");
	header("Content-Length: $new_length");
	header("Content-Range: bytes $range-$range_end/$size");
 }
else
	{
	$new_length=$size;
	header("Content-Length: ".$size);
	}
 /* output the file itself */
 $chunksize = 1*(1024*1024); //you may want to change this
 $bytes_send = 0;
 if ($file = fopen($file, 'r'))
 {
	if(isset($_SERVER['HTTP_RANGE']))
	fseek($file, $range);

	while(!feof($file) && 
		(!connection_aborted()) && 
		($bytes_send<$new_length)
	)
	{
		$buffer = fread($file, $chunksize);
		print($buffer); //echo($buffer); // is also possible
		flush();
		$bytes_send += strlen($buffer);
	}
 fclose($file);
} else die('Error - can not open file.');

die();
}

/*********************************************
			Example of use
**********************************************/

/* 
Make sure script execution doesn't time out.
Set maximum execution time in seconds (0 means no limit).
*/
set_time_limit(0);

// Require password for secure download
if(isset($_REQUEST['filepassword']) && $_REQUEST['filepassword'] == 'passwordtest')
{
	$securefolder = 'backups/database/sql/';
	$securefile = 'database_full_backup-2009-06-05-1244173623.sql';
	//$securefile

	$file_path = $securefolder . $securefile;
	//echo($file_path . 'test');
	output_file($file_path, 'database_full_backup-2009-06-05-1244173623.sql', 'sql');
	// Output secured download file
}
else
{
	echo($file_path);
	//header('Location: https://localhost/index.php?incorrectfile=true');
}

?>

Link to comment
https://forums.phpfreaks.com/topic/161024-force-dowload-in-browser-issue/
Share on other sites

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.