2009-03-01 10 views
2

if節でテスト条件として使用すると、file_get_contentsが空のファイルを作成しないようにするにはどうすればよいですか?file_get_contents空のファイルを作成する

空のファイルは関係なく作成され、別のメソッドでgetimagesize()を呼び出すと失敗します。

問題は、私は自分のコード設定を持っているので、最初に呼び出されるときに画像を保存するか、以前に保存した画像を表示するかどうかが決まります。これは、ファイルの存在によって部分的に異なります。空のファイルが作成されると、後で自分のコードを呼び出すときに問題が発生します。

ファイルが存在し、0より大きい場合、チェックを追加する最も簡単な方法はありますか?

私のコードが機能しているかどうかにかかわらず、file_get_contentsはエラーを出力します。このエラーは(私のif条件で)説明されているので、可能であれば私のアプリケーションの出力を中断するエラーを避けたいと思います。実際のエラーを隠すことなくこれをオフにする方法はありますか?

if (file_put_contents($imageDir . $pk . '.jpg', file_get_contents($pic_url))) 
{ 
     return $imageDir . $pk . '.jpg'; 
} 
else 
{ 
     return 'removed.jpg'; 
} 

答えて

1

それは空のファイルを作成しているのfile_get_contents()ではない、それは)ますfile_put_contents(です。

file_put_contents()は、2番目のパラメータが空であってもファイルを作成します。したがって、空のファイル。

最初に存在するファイルを確認する必要があります。

file_put_contents()を条件式の中に移動するのが最も簡単な修正です。コンテンツがある場合にのみファイルを作成します。

if (($filecontents = file_get_contents($pic_url)) !== false) 
{ 
    file_put_contents($imageDir . $pk . '.jpg', $filecontents); 
    return $imageDir . $pk . '.jpg'; 
} 
else 
{ 
    return 'removed.jpg'; 
} 

ここではまだ問題が残っています。

  • $ pic_urlを正しく検証していない限り、セキュリティ上の脆弱性が存在する可能性があります。ユーザーがローカルファイルへの相対パスを入力するとどうなりますか?
  • ファイルが見つからない場合、file_get_contents()は警告をスローします。通常は、file_exists()を最初にチェックすることで対処しますが、http:wrapperはfile_exists()をサポートしていないため、ここでは不可能です。したがって、file_get_contents()の前に@でエラーを抑制することができます。このようなエラーを抑制することは、ほとんどの場合避けなければなりません。
  • '@'でエラーを抑制しても、file_get_contents()の呼び出しにはまだ時間がかかることがあります。アドレスが間違っていると、サーバーからの応答が得られず、スクリプトが実行されない時間(おそらく30秒)があるため、エンドユーザーはフィードバックを得ることができません。これはあなたのアプリで考慮する必要があります。
3

ファイルがfile_existsを使用して存在しているかどうかを確認します。

if (file_exists($pic_url)) { 
    $contents = file_get_contents($pic_url); 
    if (!empty($contents)) { 
     file_put_contents($imageDir . $pk . '.jpg', $contents); 
     return $imageDir . $pk . '.jpg'; 
    } 
} 
return 'removed.jpg'; 
+0

明らかにfile_exists()はHTTP/HTTPS URLラッパーでサポートされていません(statサポートに依存しています)。つまり、ここでは機能しません。 – thomasrutter

関連する問題