2011-10-26 14 views
1

私は同様のリクエスト/質問を検索しましたが、何も私の状況に合致していないようです。PHPを使用した散発的な壊れた画像readfile

アップロードされたファイルをブラウザに送信/出力するためにPHPファイルを使用します。私はPHPファイルを "リーダー"ファイルと呼びます。 (単純化のために削除、追加のファイルタイプを持つ)読者の煮詰めバージョンは、次のとおりです。

<?php 
    if($_GET['upload']){ // for files uploaded via CMS uploader 
     $file = $site_directory . $uploads_path . $_GET['upload']; 
    } 
    if (file_exists($file)) { 
     header('Content-Description: File Transfer'); 
     // JPG 
     if(strstr($file,".jpg")) 
     { 
      header('Content-type: image/jpeg'); 
      header('Content-Disposition: inline; filename='.basename($file)); 
     // OTHER FILE TYPES 
     }else 
     { 
      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; 
    }else{ 
     echo "<p>That file does not exist.</p>"; 
    } 
?> 

次の例に見るように、それは一般的に動作します。しかし、ブラウザがこのように複数の画像をロードしなければならない場合、一部の画像は読み込まれず、破損しているように見えません。実際の例はhttp://www.technotarek.com/index.php?id=25&view=gridです。最初にフォトグリッドに壊れた画像がない場合は、いくつかのハードリフレッシュを試してみてください。

これは複数のファイルや画像では信頼できない理由は何ですか?

例で画像のサイズを変更する追加のスクリプトがありますが、それは原因ではありません。私はそれを削除し、問題は残った。

その他の背景(私がこの方法を使用している理由について):当初、サーバー管理者がウェブサーバーへのアップロードを許可しなかったサイトでリーダースクリプト/ファイルを使用し始めましたが、すべてのユーザーアップロードを保存する必要がありました別のSandlotサーバー上にインストールします。 "リーダー"ファイルは、私がsandlotファイルへの直接URLが不可能なので、それらのファイルにアクセスして出力することができます。

+0

複数のイメージを並行して読み込んでいる場合は、許可されたプロセスやメモリが不足している可能性があります(共有ホスティングの場合は、いずれにせよ)。しかし、これは間違いなく言うことは難しいです。デバッグするには、コマンドラインから並行カール要求を実行してみてください。 – mario

+0

はい、これは共有ホスティングプラットフォーム上にあります。スクリプト内のプロセスやメモリを管理するために知っておいてもらえますか?そして/または、あなたはカールのデバッグの提案をこれ以上指針を提供できますか?どうもありがとう。 – technoTarek

+0

スクリプトは、サーバー上の任意のファイルをうまく処理できることに注意してください。 http://example.com/script.php?upload = ../../../../../../../../seekrit.passwords'。あなたがプライベートにしたいと思っているものは何も持っていないといいですね。 –

答えて

0

あなたの間接ダウンロード・スクリプトは、ちょうどあなたが使用できるかどうinvestiageそして、ヘッダを追加するのに役立つ場合:

をスクリプトの負荷を軽減するために、readfileに代わるだろう:mod_xsendfileX-Sendfile:ヘッダーであるため、Apacheプロセスが読み取り/送信を処理します。

+0

完全なスクリプトはもう少しです。最初に、(サイト設定の設定を介して)問題のサイトでサンドロットが使用されているかどうかを検出します。次に、その設定に基づいてファイルパスを動的に構築し、ファイルを送信します。そのため、スクリプトが必要だと思います。また、これはApacheとIISサーバー上で実行されているので、X-Sendfileのアプローチでプラットフォームに基づいて2つの異なるバージョンをスクリプト化する必要があるように思えます。私はプロセス/メモリ管理を見ていきます...あなたがその前に持っている他のリードは大いに感謝されるでしょう。 – technoTarek

関連する問題