0

ユーザーアバターをblobとして保存するMySQLテーブルがあります。画像を出力するavatar.phpというスクリプトを使用してこれらの画像をフェッチします。特定のユーザー画像をリクエストするには、avatar.php?id =(user id)を呼び出す必要があります。動的な画像名をきれいにするために、.htaccessにURL書き換えを追加して、avatar-(userid).jpgを呼び出すこともできるようにしました。これは、avatar.php?id =(userid)に変換されます。

次に、ユーザーイメージを取得し、GDを使用して操作します。getimagesize()とimagecreatefromjpeg()を使用しようとしましたが、「そのようなファイルやディレクトリがないストリームを開くことができませんでした」というエラーが引き続き発生します。これらの関数を使用しようとするスクリプトは、avatar.phpスクリプトとして、ルートディレクトリにあります。私は試した:

getimagesize('avatar.php?id=1');
getimagesize('./avatar.php?id=1');
getimagesize('/avatar.php?id=1');
...and the same but using avatar-1.jpg instead.

私のサイトの完全なURL(http://などを含む)を使用すると、実際に機能します...しかし、理由はわかりません。

//編集:file_exists()関数を使用すると、同様の問題が発生します。file_exists('./avatar.php')を試してみるとtrueが返され、get-varsを追加するとfalseが返されます。これらの関数は動的ファイルには適していませんか?

誰かが私を助けてくれませんか?

前もって感謝します

4

3 に答える 3

2

getimagesizeファイルパスが必要です。もちろん存在しないローカルハードディスク上getimagesize('avatar.php?id=1')のファイルを開こうとします。 を使用すると、パスがURLであり、HTTPラッパーを通過することがわかります。基本的に、ローカルファイルを開いていると見なされますが、PHPはバックグラウンドでHTTPリクエストを介してそのファイルをフェッチします。そのHTTPリクエストは実際に有効な画像ファイルを返しているので、それは機能します。 もちろん、画像を開こうとするたびにWebサーバーを使用する必要はありません。これは、不要なリソースの浪費です。実際、思ったとおりに機能するとしても、それでも、実行しようとしていることに対して多くのオーバーヘッドが発生します。avatar.php?id=1
getimagesize('http://example.com/avatar.php?id=1')getimagesize
getimagesize('avatar.php?id=1')

画像がデータベースに保存されている場合は、画像をデータベースに配置するときに画像の寸法を一度把握し、データベースの列に保存します。次に、データベースからサイズをクエリするだけです。


file_exists()関数を使用する場合にも同様の問題が発生します。試し file_exists('./avatar.php')てみるとtrueを返し、get-varsを追加するとfalseを返します。これらの関数は動的ファイルには適していませんか?

これらの関数はすべて、ファイルパスを想定しています。avatar.phpは有効なファイル名/パスです。avatar.php?foo=barは有効なファイル名/パスではありません。後者はURL(の一部)です。URLはローカルファイルシステムとは何の関係もありません。これらはWebサーバーを介してのみ処理され、PHPまたはディスク上の他のファイルを呼び出す場合と呼び出さない場合があります。ファイルパスURLの概念を区別する必要があります。

于 2012-10-22T12:36:34.257 に答える
2
  1. getimagesize('avatar.php?id = 1');を介さずに、データベースから変数に画像文字列を直接ロードします。
  2. imagecreatefromstringを使用して、画像を画像オブジェクトとしてロードします。その後、画像を操作して出力に送信できます。

操作なしで画像サイズが必要な場合は、 getimagesizefromstringを使用できます

于 2012-10-22T12:42:23.970 に答える
1

getimagesize解析および実行時にphpファイルが出力する「画像」ではなく、phpファイルを開こうとするため、機能しません。

これは、完全なURLが機能する理由でもあります。スクリプトがWebサーバーからの出力を要求し、Webサーバーがスクリプトを実行します(DBから画像をロードして出力します)。

Webサーバー(完全なURLを使用)を介してロードするのが、依然として最も簡単なオプションである可能性があります。

imagecreatefromstringlink )を使用して画像リソースを作成し、関数にDBからの結果を与えて、それを操作することもできます。

于 2012-10-22T12:35:46.097 に答える