Принудительно скачать приглашение php испорченный файл - PullRequest
0 голосов
/ 08 декабря 2011

У меня сейчас текущий код:

if($_POST['mode']=="save") {
    $path = $_POST['path'];
    $file = end(explode('/', $path));
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header("Content-Disposition: attachment; filename=$file");
    readfile($file);
}

Что я делаю, так это получаю путь к файлу, в котором сохранен файл, взрываю его только по имени и пытаюсь сохранить этот файл Я получаю приглашение «Сохранить как», но когда я сохраняю его и пытаюсь открыть файл, я получаю сообщение об ошибке, что файл / изображение повреждено.

Файлы сохраняются не в домашнем каталоге, а в подкаталоге с именем uploads.

Кто-то знает, что я делаю не так?

Спасибо заранее. Синан

1 Ответ

0 голосов
/ 08 декабря 2011

Я обычно использую что-то вроде этого:

$siteEmail = 'me@myemail.com';
$companyName = 'My Company';

#   Path from server root
$fileDirectory = '/home/uploads/'; // include trailing slash

// get the file reference
$passedFile = $_POST['path'];
$filename = @urldecode($passedFile); // useful if your file is sent by $_GET
if((!isset($passedFile))||(@$passedFile=='')) {
    echo "<html><title>".$companyName." - Download File</title><body>ERROR: Please pass a valid filename.<br /><br />Please go back and try again. If you continue to see this message please contact <a href=\"mailto:".$siteEmail."\">".$siteEmail."</a></body></html>";exit();
}

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

$file_extension = strtolower(substr(strrchr($filename,"."),1));

if( $filename == "" ) {
  echo "<html><title>".$companyName." - Download File</title><body>ERROR: download file NOT SPECIFIED.<br /><br />Please go back and try again. If you continue to see this message please contact <a href=\"mailto:".$siteEmail."\">".$siteEmail."</a></body></html>";
  exit;
} elseif ( ! file_exists( $fileDirectory . $filename ) ) {
  echo "<html><title>".$companyName." - Download File</title><body>ERROR: File not found.<br /><br />Please go back and try again. If you continue to see this message please contact <a href=\"mailto:".$siteEmail."\">".$siteEmail."</a>
  <p>path: ".$fileDirectory.$filename."</p>
  <p>DOCUMENT_ROOT: ".$_SERVER['DOCUMENT_ROOT']."</p>
  </body></html>";
  exit;
};

switch( $file_extension ) {
  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 "rtf": $ctype="application/rtf"; break;
  case "gif": $ctype="image/gif"; break;
  case "png": $ctype="image/png"; break;
  case "wav": $ctype="audio/wav"; break;
  case "mp3": $ctype="audio/mpeg3"; break;
  case "wmv": $ctype="video/x-ms-wmv"; break;
  case "avi": $ctype="video/avi"; break;
  case "asf": $ctype="video/x-ms-asf"; break;
  case "mpg": $ctype="video/mpeg"; break;
  case "mpeg": $ctype="video/mpeg"; break;
  case "jpeg":
  case "jpg": $ctype="image/jpg"; break;
  default: $ctype="application/force-download";
}

// Everything went fine - you could log the download in the databse here if required?

// OUTPUT THE FILE

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // cache stop
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // cache stop
header("Cache-Control: must-revalidate"); // cache stop
header("Content-Type: $ctype"); // output filetype
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($fileDirectory.$filename));
readfile($fileDirectory.$filename);
exit(); 
...