Jump to content

Download outside root with header()


ThaSaltyDawg

Recommended Posts

I have code (attached) that I used to download pdf files outside the root directory. This is done because users are required to login. I am having to transfer the site to a new server and I have everything working right except for this part. When a link is clicked to download a file I get the following error in adode acrobat:

 

Acrobat could not open 'file.pdf' because it is either not a supported file type or because the file has been damaged (for example, it was sent as an email attachment and wasn't correctly decoded).

 

When trying to down an msword .doc file I get the scribble text characters.

 

My previous server was FreeBSD and my new server is Red Hat.

 

I'm not sure if there are any setting I must change.

 

$dl_path = '/home/ebtronweb/www/download/';
$filename = 'timelog.txt';
$filename = $dl_path.$filename;

// required for IE, otherwise Content-disposition is ignored
if(ini_get('zlib.output_compression'))
  ini_set('zlib.output_compression', 'Off');

// addition by Jorg Weske
$file_extension = strtolower(substr(strrchr($filename,"."),1));

if( $filename == "" ) 
{
  echo "<html><title>eLouai's Download Script</title><body>ERROR: download file NOT SPECIFIED. USE force-download.php?file=filepath</body></html>";
  exit;
} elseif ( ! file_exists( $filename ) ) 
{
  echo "<html><title>eLouai's Download Script</title><body>ERROR: File not found. USE force-download.php?file=filepath</body></html>";
  exit;
};
switch( $file_extension )
{
  case "txt": $ctype="text/plain"; break;
  case "pdf": $ctype="application/pdf"; break;
  case "exe": $ctype="application/octet-stream"; break;
  case "zip": $ctype="application/zip"; break;
  case "doc": $ctype="application/msword"; break;
  case "xls": $ctype="application/vnd.ms-excel"; break;
  case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
  case "gif": $ctype="image/gif"; break;
  case "png": $ctype="image/png"; break;
  case "jpeg":
  case "jpg": $ctype="image/jpg"; break;
  default: $ctype="application/force-download";
}
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: $ctype");
// change, added quotes to allow spaces in filenames, by Rajkumar Singh
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");
exit();

 

is there code with an alternative way to download a file like this?

Thank you.

Link to comment
Share on other sites

I get:

 

%PDF-1.6 %âãÏÓ 32 0 obj <> endobj xref 32 52 0000000016 00000 n 0000001733 00000 n 0000001869 00000 n 0000002039 00000 n 0000002080 00000 n 0000002121 00000 n 0000002300 00000 n 0000002517 00000 n 0000002947 00000 n 0000003636 00000 n 0000003718 00000 n 0000004438 00000 n 0000005132 00000 n 0000005772 00000 n 0000006460 00000 n 0000007152 00000 n 0000007509 00000 n 0000007894 00000 n 0000027410 00000 n 0000027654 00000 n 0000043383 00000 n 0000043642 00000 n 0000044333 00000 n 0000044520 00000 n 0000044848 00000 n 0000045392 00000 n 0000045734 00000 n 0000046309 00000 n 0000046655 00000 n 0000046945 00000 n 0000047272 00000 n 0000066340 00000 n 0000066619 00000 n 0000078131 00000 n 0000078415 00000 n 0000088916 00000 n 0000089188 00000 n 0000089493 00000 n 0000089698 00000 n 0000089990 00000 n 0000090057 00000 n 0000090867 00000 n 0000091586 00000 n 0000226721 00000 n 0000243402 00000 n 0000243664 00000 n 0000260902 00000 n 0000261152 00000 n 0000275093 00000 n 0000275350 00000 n 0000284150 00000 n 0000001361 00000 n trailer <<7D6E107A9AE0BF45B51712ECF7A2EE89>]>> startxref 0 %%EOF 83 0 obj<>stream –Mas)˜hÄEõÄ X6•&mtEÍâh Aåe€´Î–1“9©‰mzÀAF®9‰r v™Ê³×LšÎ‡icÅÈrçQè̬œc4sQW–ÿ}QìûcÄ–LÕeÃÔÆ-x.âTÈ^.kN®06ÚßݧͬR¬WFúhUá‚G™ÛÎ= Ò¶SkPj*‰ ÓxAÖçS¹RñØtËݽJK+ï]s‰f:A[ôúÿ ¹šv7Z­Z¿.‰U&x_â窰)˜U2Z`"5Á»"°9V-Ї ’[<:¦KéÖ–¤

 

...there is more ofcourse...

 

I I have had this before but cannot remember how I fixed it.

Link to comment
Share on other sites

For pdf files I use

header('Content-Type: application/pdf');

 

and for doc files I use

header('Content-Type: application/doc');

 

I have other code I have tried to, but none work. I am sure that I am missing something here but I can't find it.

 

$dl_path = '/home/ebtronweb/www/media/pdf/';
$filename = '2009_BAG_Brochure3.pdf';
$file = $dl_path.$filename;	

if (file_exists($file)) 
{
    header('Content-Description: File Transfer');
    header('Content-Type: application/pdf');
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/download");
header("Content-Disposition: attachment;filename=$filename ");
header("Content-Transfer-Encoding: binary ");
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
else
{
echo "<div style=\"font-size:44px; color:#ff0000; font-weight:900\"><br>File Does Not Exist</div><br>$filename";
}

Link to comment
Share on other sites

Somehow I got it work.

 

 

 

I was using a link like:

 

$tUrl= "?page=downloads&filetype=pdf&filename=$tFilename"; and sending it to a page with the following attached code.

 

//
if(isset($_REQUEST['filename']))
{
	$FileName = $_REQUEST['filename'];
}
else
{
	$FileName = NULL;
}
//
if(isset($_REQUEST['filetype']))
{
	$FileType = $_REQUEST['filetype'];
}
else
{
	$FileType = NULL;
}

switch(strtoupper($FileType))
{
	case "PDF":
		$dl_path = '/home/web/www/media/downloads/pdf/';
		$ctype = "application/pdf";
	   	break;

	case "XLS":
		$dl_path = '/home/web/www/media/downloads/xls/';
		$ctype = "application/vnd.ms-excel";
	   	break;

	case "DOC":
		$dl_path = '/home/web/www/media/downloads/doc/';
		$ctype = "application/msword";
	   	break;
}
$file = $dl_path.$FileName;	


if (file_exists($file)) 
{
    header('Content-Description: File Transfer');
    header('Content-Type: $ctype');
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/download");
header("Content-Disposition: attachment;filename=$FileName ");
header("Content-Transfer-Encoding: binary ");
    header('Content-Length: ' . filesize($file));
    //ob_clean();
    //flush();
    readfile($file);
    exit;
}
else
{
echo "<div style=\"font-size:44px; color:#ff0000; font-weight:900\"><br>File Does Not Exist</div><br>$FileName";
}

 

But I kept getting those errors. All I did was place that file on the root directory and link directly to it and it work.

 

$tUrl= "download.php?filetype=pdf&filename=$tFilename";

 

I checked to see if there was a problem with my paths or something but it was not. However just by placing it on the root it work.

 

While I got it work, I still do not understand what happened?

 

But thanks for your help

 

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • 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.