Download text file in IE7

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
Mackan
Forum Newbie
Posts: 1
Joined: Tue Nov 25, 2008 5:54 am

Download text file in IE7

Post by Mackan »

I've problem when I run the following in IE7 (test.txt is an ASCII text file):

downloadFile.php?FileName="test.txt"

In Firefox, Opera and IE6 I'll get a "Save as" dialogue window, but in IE7 I'll only get an empty HTML window.
Why does it not work in IE7?


downloadFile.php:

Code: Select all

 
<?php
 
function dlFile($file){
  // First, see if the file exists
  if (!is_file($file)) { die("<b>404 File not found!</b>"); }
 
  // Gather relevent info about file
  $len = filesize($file);
  $fileName = basename($file);
  $fileExtension = strtolower(substr(strrchr($filename, "."), 1));
 
  // This will set the Content-Type to the appropriate setting for the file
  switch($fileExtension) {
    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;
    case "mp3": $ctype = "audio/mpeg"; break;
    case "wav": $ctype = "audio/x-wav"; break;
    case "mpeg":
    case "mpg":
    case "mpe":
      $ctype = "video/mpeg"; break;
    case "mov": $ctype = "video/quicktime"; break;
    case "avi": $ctype = "video/x-msvideo"; break;
    case "txt": $ctype = "application/octetstream"; break;
 
    //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
    case "php":
    case "htm":
    case "html":
      die("<b>Cannot be used for ". $fileExtension . " files!</b>"); break;
 
    default: $ctype = "application/octetstream";
  }
 
  // Begin writing headers
  ob_start();
  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");
 
  // Use the switch-generated Content-Type
  header("Content-Type: $ctype");
 
  // Force the download
  header("Content-Disposition: attachment; filename=\"" . $fileName "\"");
  header("Content-Transfer-Encoding: binary");
  header("Content-Length: " . $len);
  ob_end_flush();
 
  @readfile($file);
  exit();
}
 
if (!isset($_GET['FileName'])) die("<b>Parameter FileName is not set!</b>");
 
dlFile($_GET['FileName']);
 
?>
 
Rovas
Forum Contributor
Posts: 272
Joined: Mon Aug 21, 2006 7:09 am
Location: Romania

Re: Download text file in IE7

Post by Rovas »

Probably it' s a header problem but remove the @ from readfile to verify throughly.
Use this:

Code: Select all

 
// it will force the browser to download   
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    $attachement="Content-Disposition: attachment; filename=" .$filename ."\";
     header($attachement);
     header("Content-Length: " . strlen($filename));
     header("Content-Transfer-Encoding: binary");
     header("Pragma: public");
     header("Expires: Sat, 01 Jan 2000 12:00:00 GMT");
     file_get_contents($filename); //or you could use echo, print for the content
 
mmj
Forum Contributor
Posts: 118
Joined: Fri Oct 31, 2008 4:00 pm

Re: Download text file in IE7

Post by mmj »

Rovas wrote:Probably it' s a header problem but remove the @ from readfile to verify throughly.
Use this:

Code: Select all

 
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
That won't be very helpful since only the last header will be sent.

Use the second param to send all 3 headers.

http://php.net/header
Post Reply