2016-10-13 12 views
-1

注:私は解決策を実装しようとしました:How to fix "Headers already sent" error in PHPとそれは役に立たなかったので、この質問を投稿しました。 私は同様の問題についてさまざまな投稿を行ってきましたが、解決策はありませんでした。私は、このボタンをクリックすると上のエラーを次取得PHPでダウンロードエラーがあります

<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); 
} 
?> 

:以下は、私のコードです

%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���� 
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 

とその後

、私は以下のようなWebページの何かの読めない記号を取得

注: 私はob_start()とob_flush()をそれぞれスクリプトの最初と最後に使用しましたが、それでも私は同じエラーを受けました。

注:完全なページで他のPHPスクリプトを使用していません。これが唯一のスクリプトです。しかし、私は別のフォームタグを持っていますが、これはアクションを実行する際に別のWebページにリンクし、固有の名前とIDを持つ独自の送信ボタンを持っています。 助けてください。

+1

[PHPで「ヘッダがすでに送信されました」というエラーを修正する方法](http://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php) – Ivar

+0

ウェブページのヘッダーを変更する前に何も出力できません – rak007

+0

ヘッダーを設定する場合は、何かを出力する前にヘッダーを設定する必要があります。これには 'echo'や ''タグの何かが含まれます。ヘッダーを設定する前にフォームを出力しているので、このエラーが発生します。フォームをページの下部に移動すると機能します。 – Ivar

答えて

1

次の解決方法試してみてください、そして、

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

downloads.phpという名前の新しいファイルを作成し、次のコードを記述します:formタグを削除し、以下のようにアンカーを使用して、あなたのウェブページで を

<?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; 
?> 

私はこのコードをテストしました。これはChromeとIEの両方に最適です。必要に応じて、ファイル名とファイルパスを変更してください。 これが役立つ場合は、投票することを忘れないでください。

あなたが持っている
+0

ちょっと、ちょっとした変更を加えてこのコードをすばやく実装しましたが、それは魅力的なように機能しました。真に解決策は完璧で実装が簡単です。ソリューションに感謝します。私は、ここの人々が問題を解決しようとするのではなく、投票して批判することを気にしていたが、あなたは私の一日を救ったと感じ始めた。ありがとう兄貴。 – ITSagar

+0

ありがとうございました。お手伝いをいたします。幸せなコーディングを... –

0

...あなたが欲しい

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

... PHPのヘッダ(...)呼び出しの前に発生することがあり

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

だけのコードでは、より多くのPHP(またはいずれかでありますサーバー側コード)であり、HTML、CSS、またはプレーンテキストではありません。サーバーがコンテンツを送信するには、ヘッダーを送信する必要があります。一度送信すると、再送信できません。したがって、コンテンツを送信する前にヘッダーを設定する必要があります。

関連する問題