PHP - отправить файл пользователю - PullRequest
43 голосов
/ 21 мая 2010

У меня есть pdf-файл на диске, который мне нужно отправить пользователю, когда он делает запрос к php-скрипту, как лучше всего это сделать?

Спасибо

Ответы [ 4 ]

54 голосов
/ 21 мая 2010

Предполагая, что это на сервере:

readfile () - выводит файл

Пример из http://php.net/manual/en/function.readfile.php

36 голосов
/ 06 января 2015

Вот что вам нужно для отправки файла с PHP:

$filename = "whatever.jpg";

if(file_exists($filename)){

    //Get file type and set it as Content Type
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    header('Content-Type: ' . finfo_file($finfo, $filename));
    finfo_close($finfo);

    //Use Content-Disposition: attachment to specify the filename
    header('Content-Disposition: attachment; filename='.basename($filename));

    //No cache
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');

    //Define file size
    header('Content-Length: ' . filesize($filename));

    ob_clean();
    flush();
    readfile($filename);
    exit;
}

Как прокомментировал Джулиан Решке, проверенный ответ МОЖЕТ работать, но он полон бесполезных заголовков. Тип контента должен быть установлен на реальный тип файла, иначе некоторые браузеры (особенно мобильные браузеры) могут не загружать его должным образом.

3 голосов
/ 01 ноября 2011

Если вы используете Apache или Lighty, то «лучший» способ сделать это с точки зрения производительности - это использовать заголовок X-Sendfile. Смотрите этот урок: http://www.jasny.net/articles/how-i-php-x-sendfile/

1 голос
/ 10 июня 2012

Хорошо, так что я не эксперт в PHP, я могу взять кредит только за то, что собрал несколько других фрагментов PHP, чтобы добиться того, что мне было нужно, и я подумал, что мне лучше опубликовать это решение через несколько форумы, которые задавали тот же вопрос, но я не мог заставить себя работать. Казалось, что решения не было нигде, так что вот оно. Меня устраивает... Итак, сначала я создал PDF-форму и добавил кнопку, которая затем отправляет форму. В действиях этой формы отправки я сказал PDF полный документ. Затем я дал ему ссылку на страницу php, такую ​​как mail_my_form.php Затем я создал форму php и назвал ее так же, как указано выше ... mail_my_form.php И последнее, что нужно создать папку с именем pdfs в корне, куда пойдет этот php-код. (Таким образом, если вы поместите php в папку с именем email, то внутри папки с электронной почтой вам понадобится еще одна папка с именем pdfs) Теперь, что делает этот скрипт: Сохраняет PDF в файл с именем pdfs. Затем он прикрепляет файл к электронной почте и отправляет его. Затем он удаляет файл из папки PDF для экономии места. (Вы также можете отключить функцию удаления, чтобы сохранить формы на FTP, если хотите.
Вот оно.

<?php 
$fileatt = date("d-m-Y-His") . ".pdf";  // Creates unique PDF name from the date 
copy('php://input',"pdfs/".$fileatt); // Copies the pdf form data to a folder named pdfs 
$fileatt = "pdfs/".$fileatt; // Path to the file gives the pdfs folder plus the unique file name we just assigned
$fileatt_type = "application/pdf"; // File Type 
$fileatt_name = "Application Form_".$fileatt.".pdf"; // Filename that will be used for the file as the attachment when it is sent

$email_from = "mywebsite"; // Who the email is from 
$email_subject = "Completed online Applications"; // The Subject of the email 
$email_message = "Please find a recent online application attached.
";
 $email_message .= "Any problems please email me...
"; // Message that the email has in it 

$email_to = "youremail@yourserver.com"; // Who the email is to 

$headers = "From: ".$email_from;

//no need to change anything else under this point

$file = fopen($fileatt,'rb'); 
$data = fread($file,filesize($fileatt)); 
fclose($file); 

$semi_rand = md5(time()); 
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 

$headers .= "\nMIME-Version: 1.0\n" . 
"Content-Type: multipart/mixed;\n" . 
" boundary=\"{$mime_boundary}\""; 

$email_message .= "This is a multi-part message in MIME format.\n\n" . 
"--{$mime_boundary}\n" . 
"Content-Type:text/html; charset=\"iso-8859-1\"\n" . 
"Content-Transfer-Encoding: 7bit\n\n" . 
$email_message .= "\n\n"; 

$data = chunk_split(base64_encode($data)); 

$email_message .= "--{$mime_boundary}\n" . 
"Content-Type: {$fileatt_type};\n" . 
" name=\"{$fileatt_name}\"\n" . 
//"Content-Disposition: attachment;\n" . 
//" filename=\"{$fileatt_name}\"\n" . 
"Content-Transfer-Encoding: base64\n\n" . 
$data .= "\n\n" . 
"--{$mime_boundary}--\n"; 

$ok = @mail($email_to, $email_subject, $email_message, $headers); 

if($ok) { 
unlink($fileatt); //NOW WE DELETE THE FILE FROM THE FOLDER pdfs 
Header("Location: nextpage.php"); //where do we go once the form has been submitted.

} else { 
die("Sorry but the email could not be sent. Please go back and try again!"); 
} 
?>

Надеюсь, это поможет некоторым из вас.

Ричард Уильямс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...