2010-09-15 4 views
2

Я создал простой файловый менеджер, где пользователи могут загружать файлы любого типа, такие как файлы pdf, word или gif. Я хочу, чтобы все они загружали файл, а не просматривали его в браузерах. Загруженные имена файлов хранятся в базе данных.Force file download in php

+3

Возможный дубликат [Принудительно загрузить файл с помощью PHP] (http://stackoverflow.com/questions/1465573/forcing-to-download-a- file-using-php) – Randolpho

+0

На этом сайте было задано несколько десятков или более раз. – Randolpho

+0

Я прошу многоформатную загрузку, а не только PDF. Я бы хотел, чтобы пользователи загружали слова, excel, gif, а также – ktm

ответ

5

Вы можете использовать заголовок "Content-Disposition" для этого:

header("Content-Disposition: attachment"); 

PHP manual является прекрасным примером для этого.

2

Обычно устанавливая Content-Disposition на attachment перед отправкой файла, загружайте браузер.

Вы либо необходимо настроить веб-сервер, чтобы обеспечить этот заголовок для файлов или отправить их самостоятельно с помощью PHP, посылая конкретный заголовок перед тем, как:

header('Content-Disposition: attachment; filename=your_file_name.pdf'); 

Берегитесь, что первое решение лучше, как вы выиграли Риск ваших загрузок сокращается, потому что время выполнения скрипта слишком велико (вы также можете его изменить).

6
<?php 
// We'll be outputting a PDF 
header('Content-type: application/pdf'); 

// It will be called downloaded.pdf 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 

// The PDF source is in original.pdf 
readfile('original.pdf'); 
?> 

http://php.net/manual/en/function.header.php

0
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT\n"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Content-type: application/pdf;\n"); 
$len = filesize($filename); 
header("Content-Length: $len;\n"); 
header("Content-Disposition: attachment; filename=\"downfile.pdf\";\n\n"); 
echo readfile($filename) 
+1

Если вы хотите избежать кеширования, лучше использовать заголовок 'Cache-Control: no-cache'. Эти новые строки ('\ n') и'; 'не нужны. – Lekensteyn

0

исходный код взят из библиотеки TCPDF

  // download PDF as file 
      if (ob_get_contents()) { 
       $this->Error('Some data has already been output, can\'t send PDF file'); 
      } 
      header('Content-Description: File Transfer'); 
      if (headers_sent()) { 
       $this->Error('Some data has already been output to browser, can\'t send PDF file'); 
      } 
      header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1 
      header('Pragma: public'); 
      header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past 
      header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); 
      // force download dialog 
      if (strpos(php_sapi_name(), 'cgi') === false) { 
       header('Content-Type: application/force-download'); 
       header('Content-Type: application/octet-stream', false); 
       header('Content-Type: application/download', false); 
       header('Content-Type: application/pdf', false); 
      } else { 
       header('Content-Type: application/pdf'); 
      } 
      // use the Content-Disposition header to supply a recommended filename 
      header('Content-Disposition: attachment; filename="'.basename($name).'";'); 
      header('Content-Transfer-Encoding: binary'); 
      $this->sendOutputData($this->getBuffer(), $this->bufferlen); 
      break; 

в любом случае наиболее важной частью является

header('Content-Disposition: attachment; filename="'.basename($name).'";'); 

и заметить, что ребро al ; внутри строки, без нее, это не сработает