Datei an den Benutzer senden

Lesezeit: 5 Minuten

Benutzeravatar von Ian Morgan
Ian Morgan

Ich habe eine PDF-Datei auf der Festplatte, die ich an einen Benutzer senden muss, wenn er eine Anfrage an ein PHP-Skript stellt. Was ist der beste Weg, dies zu tun?

Benutzeravatar von Adirael
Adirael

Angenommen, es liegt auf dem Server:

readfile() — Gibt eine Datei aus

NOTIZ: Nur schreiben

readfile($file);

wird nicht funktionieren. Dadurch wird der Client ewig auf eine Antwort warten. Sie müssen Header definieren, damit es wie vorgesehen funktioniert. Siehe dieses Beispiel aus dem offiziellen PHP-Handbuch:

<?php
$file="monkey.gif";

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=".basename($file));
    header("Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>

  • Funktioniert bei mir unter IE8/Vista. Erhalten Sie eine Fehlermeldung oder lädt es einfach eine weiße Seite?

    – Adriael

    21. Mai 2010 um 14:29 Uhr

  • Das Beispiel enthält viel Mist. Inhaltsbeschreibung existiert nicht in HTTP. Content-Type sollte auf den tatsächlichen Medientyp oder gar keinen gesetzt werden. Der Code für Content-Disposition erzeugt für viele Dateinamen falsche Header. Content-Transfer-Encoding existiert nicht in HTTP. Siehe auch blogs.msdn.com/b/ieinternals/archive/2012/05/16/… in Bezug auf Cache-Control.

    – Julian Reschke

    20. Mai 2012 um 7:42 Uhr

  • @Julian Reschke: Und warum ist es dann offiziell auf php.net?

    – Tim

    23. April 2014 um 9:32 Uhr

  • Ich habe das Gefühl, dass diese Antwort Leuten helfen könnte, die sich über Kopfzeilen nicht sicher sind.

    – Dominostein

    23. April 2015 um 13:10 Uhr

  • ich fand diesen Blogbeitrag (Und Begleitskript (mit einigen Verbesserungen von ‘Hargobind’)) von Armand Niculescu sehr hilfreich. Beide Links sind übrigens mehrfach in archive.org vorhanden.

    – GitaarLAB

    23. Juli 2015 um 1:46 Uhr

Benutzeravatar von Rayjax
Rayjax

Folgendes benötigen Sie, um eine Datei mit PHP zu senden:

$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;
}

Wie Julian Reschke kommentierte, KANN die validierte Antwort funktionieren, aber sie ist voller nutzloser Header. Der Inhaltstyp sollte auf den tatsächlichen Dateityp eingestellt werden, da er sonst von einigen Browsern (insbesondere mobilen Browsern) möglicherweise nicht ordnungsgemäß heruntergeladen wird.

  • Vielen Dank, besonders für ob_clean(); flush();

    – GHosT

    26. September 2017 um 6:43 Uhr

  • könnten Sie bitte Kommentare hinzufügen ob_clean Und flush Bits? Welche potenziellen Probleme lösen sie?

    – Jakow L

    20. Januar 2018 um 10:12 Uhr

  • Content-Disposition erfordert ” ” um den Dateinamen, falls er Leerzeichen enthält

    – gleich

    6. Mai 2018 um 2:04 Uhr

  • funktionierte wie ein Zauber für mich, danke

    – DarkCygnus

    12. April 2022 um 21:38 Uhr

Benutzeravatar von chiborg
chiborg

Wenn Sie Apache oder Lighty verwenden, ist dies aus Sicht der Leistung der “beste” Weg, dies zu tun X-Sendfile Header. Siehe dieses Tutorial: https://www.h3xed.com/programming/how-to-use-x-sendfile-with-php-apache

Ok, ich bin kein PHP-Experte, ich kann nur Anerkennung dafür verdienen, dass ich ein paar andere PHP-Snippets zusammengestellt habe, um das zu erreichen, was ich brauchte, und ich dachte, ich sollte diese Lösung besser in ein paar Foren posten, die mich gefragt haben die gleiche Frage, aber ich konnte nicht selbst zur Arbeit kommen. Es schien nirgendwo eine Lösung zu geben, also hier ist sie. Es funktioniert für mich … Ok, also zuerst habe ich das PDF-Formular erstellt und eine Schaltfläche hinzugefügt, die dann das Formular absendet. In den Aktionen dieses Sendeformulars habe ich ihm gesagt, dass er das vollständige Dokument als PDF erstellen soll. Dann gab ich ihm einen URL-Link zu einer PHP-Seite, wie mail_my_form.php. Dann erstellte ich ein PHP-Formular und benannte es genauso wie oben … mail_my_form.php Eine letzte Sache ist, einen Ordner namens pdfs im Stammverzeichnis zu erstellen wohin dieser PHP-Code gehen wird. (Wenn Sie also die PHP-Datei in einen Ordner namens E-Mail legen, benötigen Sie innerhalb des Ordners E-Mail einen weiteren Ordner namens PDFs.) Was dieses Skript jetzt macht, ist: Speichert die PDF-Datei unter dem Dateinamen PDFs. Dann hängt es die Datei an eine E-Mail an und sendet sie. Dann löscht es die Datei aus dem Ordner pdfs, um Platz zu sparen. (Sie könnten auch die Löschfunktion herausnehmen, um Ihre Formulare auf Ihrem FTP zu speichern, wenn Sie möchten.
Hier ist es.

<?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 = "[email protected]"; // 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!"); 
} 
?>

Hoffe das hilft einigen von euch.

Richard Williams

1445040cookie-checkDatei an den Benutzer senden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy