1

ファイルのダウンロードページにPHPを使用しています。問題コードのスニペットは次のとおりです。

if (file_exists($attachment_location)) {
    header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
    header("Cache-Control: public"); // needed for i.e.
    header("Content-Type: application/zip");
    header("Content-Transfer-Encoding: Binary");
    header("Content-Length:".filesize($attachment_location));
    header("Content-Disposition: attachment; filename=file.zip");
    readfile($attachment_location);  
    die("Hooray");   
}
else {
    die("Error: File not found.");
}

このコードは、ローカルでテストする場合は完全に正常に機能しますが、ライブサーバーにデプロイした後、ブラウザーは「ページが見つかりません」というエラーを返します。.htaccessの問題かもしれないと思いましたが、ライブサーバー上のすべての.htaccessファイルはローカルの対応するファイルと同じです。次の推測は、ライブサーバーのPHP構成ですが、どのPHP設定がこの動作を引き起こす可能性があるのか​​わかりません。

file_exists()関数は常にtrueを返します-ライブサーバーでこれを確認しましたが、ファイルやそのサイズなどを常に正しく取得しているため、ファイルにハンドルがあります。ダウンロードは実行されません!

メインサイトはWordpressサイトですが、このコードはWordpressページの一部ではなく、サイトルート内のスタンドアロンディレクトリにあります。

更新:is_file()とis_readable()は両方ともファイルに対してtrueを返しているので、それは問題ではありません。問題を引き起こしている特定の行は次のとおりです。

readfile($attachment_location)

それまでのすべてがとても幸せです。

4

2 に答える 2

4

ファイルが存在するからといって、それを提供できるとは限りません。間違った権限を持っているか、他の何かがそれに書き込んでいる間ロックされている可能性があり、ファイルでさえない可能性があります。file_exists関数は、ディレクトリ、シンボリックリンクなどに対してtrueを返します。

代わりにis_fileの使用を検討することをお勧めします。また、ファイルのアクセス許可を確認するためにis_readableを確認することもできます。

于 2012-11-22T15:48:25.793 に答える
2

ファイルサイズの問題であることが判明しました。問題のファイルはかなり巨大でした(300MB以上)-私はそれをより小さなファイル(〜1MB)に置き換えてみましたが、すべてが期待どおりに機能しています。次のハードルは、サーバーに大きなファイルを処理させることです。皆さんの助けに感謝します。

編集:php.netのreadfile関数ページで、readfile関数の制限とそれらを回避する方法について多くの議論があります

于 2012-11-22T16:48:25.107 に答える