2016-07-07 22 views
1

Stack Overflowに関する記事をすべて読んだので、問題を修正できません。PHP force download壊れたPDFファイル

$file = $_GET['url']; 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
header('Content-Length: ' . filesize($file)); 
readfile($file); 
exit; 

上記言及コードを直接ルート上からファイルをダウンロードして、はい、それはPDFファイルをダウンロードしているが、ファイルのみ1キロバイトのサイズではなく、元のサイズである:私は、次のコードを使用しています。 $ _GET ['url']には../dir/dir/filename.pdfが入っています。ファイル名にはスペースも含まれます。セキュリティ上の理由から、私はファイル名を共有できません。

私はどこが間違っているか教えてください。

+0

さらに私はapplication/octet-streamをapplication/pdfに置き換えました。 –

+0

質問は "PHP(How to)PDFファイルのダウンロードを強制する"ですが、あなたの質問では、 "上記のコードはファイルをダウンロードしています" - だから問題は何ですか? – ajmedway

+0

上記のコードは、破損しているファイルをダウンロードしています。 PDFファイルのサイズを確認すると、1KBになります。混乱しているタイトルについては申し訳ありません。 –

答えて

1

ファイルにアクセスするためにWebサーバーのパスを使用していることを確認してください。たとえば、パスが/home/yourusername/public/sitename/downloads/<filename>の場合は、最初に確認してください。これをPHPスクリプトの上部で実行して現在のスクリプトのフルパス:

echo '<pre>FILE PATH: '.print_r(__FILE__, true).'</pre>'; 
die(); 

のみurlencode()を使用して、URLとし、任意の文字エンコーディングの問題を処理するために、受信したPHPスクリプトの使用urldecode()にファイル名を送信します。

こちらをご覧ください:http://php.net/manual/en/function.urlencode.php 、ここに:http://php.net/manual/en/function.urldecode.php

そこでここでは、あなたのURLを作成します。

<a href="/my-download-url/<?= urlencode('file name.pdf') ?>">Download File</a>

そして、あなたのPHPスクリプトで:

$file_base_path = '/home/yourusername/public/sitename/downloads/'; 
$file = urldecode($_GET['url']); 
$file = $file_base_path . $file; 
$file = $_GET['url']; 
if (file_exists($file)) 
{ 
    if (FALSE!== ($handler = fopen($file, 'r'))) 
    { 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename='.basename($file)); 
     header('Content-Transfer-Encoding: chunked'); //changed to chunked 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     //header('Content-Length: ' . filesize($file)); //Remove 

     //Send the content in chunks 
     while(false !== ($chunk = fread($handler,4096))) 
     { 
      echo $chunk; 
     } 
    } 
    exit; 
} 
echo "<h1>Content error</h1><p>The file does not exist!</p>"; 

私はこれが役に立てば幸い君は!

+0

ファイルが存在していても存在しません... ifを入力しなくてもかまいません。 http?または "../dir/dir/filename.pdf"で十分でしょうか? –

+0

あなたはファイルがどこにあるかを調べる。そうしないとどこにも行きません。はい、相対パスを使用できますが、実行されるスクリプトの場所を参照して正しいパスでなければなりません。上のコードを使用して '$ file_base_path'にフルパスを見つけて入力してください。 – ajmedway

+0

woohoo ... okだから、今はファイルを正しくダウンロードしているが、唯一の問題はその.pdf拡張子でダウンロードしていないことだ。私はopenwithでダウンロードされたファイルを開くことができます... file_base_pathトリックが働いた。拡張子が.pdfのファイルをダウンロードできるようにするにはどうすればよいですか? Content-Typeをapplication/pdfに変更しますか?また、上記の4行目のコードでは、私はその行が必要ではないと思います。 –

関連する問題