2016-10-13 2 views
-1

Hinweis: Ich habe versucht, die bereitgestellten Lösungen zu implementieren: How to fix "Headers already sent" error in PHP und es hat nicht geholfen, also habe ich diese Frage geschrieben. Ich habe verschiedene Beiträge auf ähnliche Problem gegangen, aber keine der Lösungen funktioniert. Im Anschluss ist mein Code:Datei Download mit PHP gibt Fehler

<form role="form" method="POST"> 
<input type="submit" name="dff" id="dff" class="btn btn-default" value="Download Franchisee Form"></input> 
</form> 
<?php 
if(isset($_POST['dff'])) 
{ 
    $yourfile="MyFile.pdf"; 
    $fp = @fopen($yourfile, 'rb'); 
    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) 
    { 
    header('Content-Type: "application/octet-stream"'); 
    header('Content-Disposition: attachment; filename="yourname.file"'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header("Content-Transfer-Encoding: binary"); 
    header('Pragma: public'); 
    header("Content-Length: ".filesize($yourfile)); 
    } 
    else 
    { 
    header('Content-Type: "application/octet-stream"'); 
    header('Content-Disposition: attachment; filename="yourname.file"'); 
    header("Content-Transfer-Encoding: binary"); 
    header('Expires: 0'); 
    header('Pragma: no-cache'); 
    header("Content-Length: ".filesize($yourfile)); 
    } 
    fpassthru($fp); 
    fclose($fp); 
} 
?> 

ich Fehler folgende erhalten diese Schaltfläche auf klicken:

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\GoogleKids\Franchisee.php:116) in C:\xampp\htdocs\GoogleKids\Franchisee.php on line 133 

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\GoogleKids\Franchisee.php:116) in C:\xampp\htdocs\GoogleKids\Franchisee.php on line 134 

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\GoogleKids\Franchisee.php:116) in C:\xampp\htdocs\GoogleKids\Franchisee.php on line 135 

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\GoogleKids\Franchisee.php:116) in C:\xampp\htdocs\GoogleKids\Franchisee.php on line 136 

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\GoogleKids\Franchisee.php:116) in C:\xampp\htdocs\GoogleKids\Franchisee.php on line 137 

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\GoogleKids\Franchisee.php:116) in C:\xampp\htdocs\GoogleKids\Franchisee.php on line 138 

und danach bekomme ich unleserlich Symbole auf der Web-Seite so etwas wie unten:

%PDF-1.5 %���� 1 0 obj <> endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 7 0 R/Group<>/Tabs/S>> endobj 4 0 obj <> stream ����JFIF``��ZExifMM*JQQ�Q�������C !(!0*21/*.-4;[email protected]?]c\RbKSTQ��C''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ��d9"�� ���}!1AQa"q2���#B��R��$3br� %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������������������������������������������������������������������������� ���w!1AQaq"2�B���� #3R�br� $4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���� 

Hinweis: Auch ich habe ob_start() und ob_flush() am Anfang und Ende des Skripts, immer noch habe ich den gleichen Fehler.

Hinweis: Ich habe kein anderes PHP-Skript auf der vollständigen Seite verwendet. Dies ist das einzige Skript. Ich habe jedoch ein anderes Formular-Tag, das auf eine andere Webseite verweist, wenn eine Aktion ausgeführt wird, und es hat seine eigene separate Schaltfläche zum Senden mit einem eindeutigen Namen und einer ID. Bitte helfen.

+1

Mögliche Duplikate von [Wie zu beheben "Header bereits gesendet" Fehler in PHP] (http://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php) – Ivar

+0

Sie können nichts ausgeben, BEVOR Sie die Kopfzeile einer Webseite ändern – rak007

+0

Wenn Sie eine Kopfzeile setzen möchten, MÜSSEN Sie sie tun, bevor Sie etwas ausgeben. Dies beinhaltet "echo" oder irgendetwas außerhalb der '' Tags. Sie geben Ihr Formular aus, bevor Sie die Kopfzeile festlegen, so dass Sie diesen Fehler erhalten. Verschieben Sie das Formular an den unteren Rand der Seite und es wird funktionieren. – Ivar

Antwort

1

Versuchen Sie, die folgende Lösung: Auf Ihrer Webseite, Formular-Tag entfernen und wie unten einen Anker verwenden:

<a href="downloads.php?download_file=MyFile.pdf">Download The File</a> 

Dann einen neuen Datei mit dem Namen downloads.php erstellen und schreiben Sie den folgenden Code:

<?php 
ignore_user_abort(true); 
set_time_limit(0); // disable the time limit for this script 

$dl_file = preg_replace("([^\w\s\d\-_~,;:\[\]\(\).]|[\.]{2,})", '', $_GET['download_file']); // simple file name validation 
$dl_file = filter_var($dl_file, FILTER_SANITIZE_URL); // Remove (more) invalid characters 
$fullPath = $dl_file; 

if ($fd = fopen ($fullPath, "r")) { 
    $fsize = filesize($fullPath); 
    $path_parts = pathinfo($fullPath); 
    $ext = strtolower($path_parts["extension"]); 
    switch ($ext) { 
     case "pdf": 
     header("Content-type: application/pdf"); 
     header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a file download 
     break; 
     // add more headers for other content types here 
     default; 
     header("Content-type: application/octet-stream"); 
     header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); 
     break; 
    } 
    header("Content-length: $fsize"); 
    header("Cache-control: private"); //use this to open files directly 
    while(!feof($fd)) { 
     $buffer = fread($fd, 2048); 
     echo $buffer; 
    } 
} 
fclose ($fd); 
exit; 
?> 

Ich habe diesen Code getestet, es funktionierte perfekt für mich in Chrome sowie IE. Stellen Sie sicher, dass Sie den Dateinamen und den Dateipfad entsprechend Ihren Anforderungen ändern. Vergiss nicht zu wählen, wenn dir das hilft.

+0

Hey, ich hatte eine schnelle Implementierung dieses Codes mit kleinen Änderungen, und es funktionierte wie ein Zauber. Leider ist die Lösung perfekt und einfach zu implementieren. Vielen Dank für die Lösung.Ich habe angefangen zu fühlen, dass die Leute hier nur kritisieren wollen, indem sie abstimmen anstatt zu versuchen, das Problem zu lösen, aber du hast meinen Tag gerettet. Dank bro. – ITSagar

+0

Danke und ich bin glücklich, Ihnen zu helfen. Viel Spaß beim Programmieren ... –

0

Sie haben ...

<html><?php 
    header('...'); 
?> 

Sie wollen ...

<?php 
    header('...'); 
?><html> 

Den einzigen Code, der vor einem PHP-Header (oder mehr PHP-Aufruf (...) auftreten kann, ist serverseitiger Code), nicht HTML, CSS oder Klartext. Damit der Server Inhalte senden kann, muss er die Header senden. Nach dem Senden können sie nicht erneut gesendet werden. Daher müssen Sie die Header festlegen, bevor Sie Inhalte senden.