0

MySQLデータベースを使用していくつかのフォントを保存しています。カスタムフォントファミリテキストを使用して画像を作成する必要があります。私はSplTempFileObjectを使用してsetFontメソッドを処理していますが、imagickの内容は次のとおりです。

Fatal error: Uncaught exception 'ImagickDrawException' with message 'The given font is not found in the ImageMagick configuration and the file ($_SERVER['DOCUMENT_ROOT]php:/temp) is not accessible' 

(もちろん、$ _ SERVER ['DOCUMENT_ROOT']は実際の値であり、置き換えただけです):)

解決策はありますか、それともファイルシステムにフォントを保存する必要がありますか?

コードは次のとおりです。

 $image = new \Imagick();
 $draw = new \ImagickDraw();

 $temp = new \SplTempFileObject();
 $temp->fwrite($font->getFile()->getContent());

 $image->newImage(550, 50, "black");
 $draw->setFont($temp);

$fontはDBからのデータです。問題は、ImagickDraw :: setFont()がDOCROOTを基準にしてフォントを検索するためだと思います。

4

3 に答える 3

7

この問題は、デフォルトで最大 2MB のメモリ内キャッシュを使用する SplTempFileObject が原因で発生します。 \SplTempFileObject->getFileName()戻りphp://temp \SplTempFileObject->getFileInfo()ます 空のオブジェクトを返します / ファイルポインタ \SplTempFileObject->getRealPath()は常に空の文字列を返します!

PHP で実際のファイルをファイル システムに書き込む場合0は、コンストラクト パラメーターとしてメモリ内制限を指定する必要がありますが、有効なSplFileInfoパス名もファイル名も取得できません。php://temp/maxmemory:0

はい: それは奇妙で、一時ファイルを作成するための「単純なインターフェイス」とはかけ離れています..

詳細については、http://php.net/manual/spltempfileobject.construct.phpをご覧ください。

戻るには、古いtempfile()またはを使用しtempnam()ます。私の解決策:

それ以外の $file = new \SplTempFileObject();

私が使う $file = new \SplFileObject(tempnam(sys_get_temp_dir(), rand()), 'w+');

于 2013-05-10T11:01:43.520 に答える
0

あなたの問題は、あなたのアドレス指定の誤りから来ていると思います。"/".$temp->getFileName()ドキュメントに従ってパスが取得できないと言うとき。パスを取得していないため、先頭の「/」は「サーバールートから」と表示されます。クールではありません。

getRealPathを使用して、必要なことを行うことができます。

于 2012-09-23T19:20:14.463 に答える