Принудительная загрузка вложения вместо его автоматического открытия


У меня есть веб-сайт, на котором перечислены вложения. Нажатие на эти вложения приводит к одному из двух типов поведения -

  1. Вложение откроется в том же окне.
  2. Во вложении пользователю предлагается диалоговое окно для открытия или сохранения документа.

Число 1, похоже, происходит только с PDF-файлами, но есть ли способ заставить все вложения отображать всплывающее окно Сохранить/Открыть/Отменить для пользователей?

Author: Aaron Belchamber, 2012-09-13

4 answers

Только для PDF..

// The user will receive a PDF to download
header('Content-type: application/pdf');

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

// The actual PDF file on the server is source.pdf
readfile('source.pdf');

...

Для всех других типов файлов, возможно, вы могли бы использовать..echo mime_content_type('Yourfile.ext') o

header('Content-type: '.mime_content_type('Yourfile.ext'));
header('Content-Disposition: attachment; filename="'.$output_filename.'"');
readfile($source_filename);

Остерегайтесь, что я не проверял это...

Заголовок типа содержимого указывает, какой тип файла должен быть загружен, указанный типом mime. Заголовок Content-Disposition указывает новое имя файла для файла, который должен быть загружен. Строка readfile - это не отправляемый заголовок, а вызов PHP, который получает все данные из файла и выводит их. То аргумент, который вы передаете функции readfile, - это местоположение фактического загружаемого pdf-файла.

ОБНОВЛЕНИЕ

mime_content_type() функция устарела. вам придется заменить это на это...

$finfo = new finfo;

$fileinfo = $finfo->file($file, FILEINFO_MIME);
 3
Author: TigerTiger, 2012-09-13 11:05:08

Вам необходимо отправить соответствующие заголовки типа содержимого().

Пример (для pdf, но работает для чего угодно, если вы настроите тип mimetype):

<?php
header('Content-disposition: attachment; filename=huge_document.pdf');
header('Content-type: application/pdf');   // make sure this is the correct mime-type for the file
readfile('huge_document.pdf');
?> 

Дополнительное чтение:

Http://webdesign.about.com/od/php/ht/force_download.htm

 1
Author: Gung Foo, 2012-09-13 10:55:58

Используя ответ, любезно предоставленный @Happyape, вот полный код, который я использую для принудительной загрузки документа при нажатии на ссылку вложения в Wordpress.

/**
 * Check that a page is the permalink of an attachment and force the download of the attahment if it is
 */
add_action('template_redirect', 'template_redirect');
function template_redirect(){

    global $post;

    /** Get the attachment URL as a pertty link ($url) and as a link to the file ($guid) */
    $url = get_permalink($post->ID);
    $guid = wp_get_attachment_url($post->ID);

    /** Get the file name of the attachment to output in the header */
    $file_name = basename(get_attached_file($post->ID));

    /** Get the location of the file on the server */
    $file_location = $_SERVER['DOCUMENT_ROOT'].substr($guid, strpos($guid, '/wp-content'));

    /** Get the file Mime Type */
    $finfo = new finfo;
    $mime_type = $finfo->file($file_location, FILEINFO_MIME);

    /** Check that the page we are on is a local attachment and force download if it is */
    if(is_local_attachment($url)) :

        header("Content-type: ".$mime_type, true, 200);
        header("Content-Disposition: attachment; filename=".$file_name);
        header("Pragma: no-cache");
        header("Expires: 0");

        readfile($guid); 

        exit();

    endif;

}
 0
Author: David Gard, 2012-09-13 11:47:06

Я использовал это как универсальную пантомиму, все, что вам нужно сделать, это передать некоторые параметры:

// Check download token
if (empty($_GET['mime']) OR empty($_GET['token']))
{
    exit('Invalid download token 8{');
}

// Set operation params
$mime = filter_var($_GET['mime']);
$ext  = str_replace(array('/', 'x-'), '', strstr($mime, '/'));
$url  = base64_decode(filter_var($_GET['token']));
$name = urldecode($_GET['title']). '.' .$ext; 

// Fetch and serve
if ($url)
{
    $size=get_size($url);
    // Generate the server headers
    if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE)
    {
        header('Content-Type: "' . $mime . '"');
        header('Content-Disposition: attachment; filename="' . $name . '"');
        header('Expires: 0');
        header('Content-Length: '.$size);
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header("Content-Transfer-Encoding: binary");
        header('Pragma: public');
    }
    else
    {
        header('Content-Type: "' . $mime . '"');
        header('Content-Disposition: attachment; filename="' . $name . '"');
        header("Content-Transfer-Encoding: binary");
        header('Expires: 0');
        header('Content-Length: '.$size);
        header('Pragma: no-cache');
    }

    readfile($url);
    exit;
}

// Not found
exit('File not found 8{');

И вы передаете свою ссылку следующим образом:

<a href="download.php?mime=++your file ext++&title=++ your file title ++&token=++your link to a file++">Download my file</a>

Заголовок необязателен:)

 0
Author: The Bumpaster, 2015-09-11 22:54:35