質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

GD(Graphics Library)

GD(Graphics Library)は、線や多角形、円、テキストなどを書くことができるライブラリです。グラフなどを作成する際に利用されます。

Q&A

解決済

2回答

7451閲覧

PHPのGDでサムネイル画像を生成したいがうまくいかない

okame

総合スコア54

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

GD(Graphics Library)

GD(Graphics Library)は、線や多角形、円、テキストなどを書くことができるライブラリです。グラフなどを作成する際に利用されます。

0グッド

1クリップ

投稿2015/05/02 23:05

GDを利用してアップロード画像のサムネイルを生成したいのですが、
うまくいきません。サムネイル画像が生成されないので実行すると
「Warning: imagejpeg(/test/img/thumbnail.jpg): failed to open stream: No such file or directory」
「Warning: getimagesize(/test/img/thumbnail.jpg): failed to open stream: No such file or directory in」
とエラーになり、「そんなファイル無いよ」となってしまいます。

記述内容は以下の通りです。

■画像アップロード画面------------------------------------

<html> <head> <title>ファイルアップロードのテスト</title> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> </head> <body bgcolor="#FFFFFF" text="#000000"> <font size="4">ファイルアップロードのテスト</font> <form name="form1" action="view.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="100000"> <p>画像:</p> <input type="file" name="uploadfile"><br> <p>説明:</p> <input type="text" name="comment"><br><br> <input type="submit" value="ファイルアップロード"> </form> </body> </html> ---------------------------------------------------------------- ■画像出力画面------------------------------------ <html> <head> <title>PHPのテスト</title> </head> <body> <?php $resizeX = 150; $thumbnail_name = "thumbnail.jpg"; $file_dir = '/Applications/XAMPP/xamppfiles/htdocs/test/img/'; $file_path = $file_dir.$_FILES['uploadfile']['name']; if (move_uploaded_file($_FILES['uploadfile']['tmp_name'], $file_path)) { $img_dir = '/test/img/'; $img_path = $img_dir.$_FILES['uploadfile']['name']; $thumbnail_path = $img_dir.$thumbnail_name; if (mb_strpos($_FILES['uploadfile']['type'], 'jpeg')) { $gdimg_in = imagecreatefromjpeg($file_path); $ix = imagesx($gdimg_in); $iy = imagesy($gdimg_in); $ox = $resizeX; $oy = ($ox * $iy) / $ix; $gdimg_out = imagecreatetruecolor($ox, $oy); imagecopyresized($gdimg_out, $gdimg_in, 0, 0, 0, 0, $ox, $oy, $ix, $iy); imagejpeg($gdimg_out, $thumbnail_path); imagedestroy($gdimg_in); imagedestroy($gdimg_out); $size = getimagesize($file_path); $size2 = getimagesize($thumbnail_path); ?>
ファイルアップロードを完了しました。<br> <img src="<?=$img_path ?>" <?=$size[3] ?>><br> <img src="<?=$thumbnail_path?>" <?=$size2[3]?>><br> <b><?=$_POST['comment']?></b><br> <?php } else { echo 'JPEG形式の画像をアップロードしてください。<br>'; }

} else {
echo '正常にアップロード処理されませんでした。<br>';
}
?>

</body> </html> ----------------------------------------------------------------

お手数ですが、ご教示のほど宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

lang

1imagejpeg($gdimg_out, $thumbnail_path);

lang

1$size2 = getimagesize($thumbnail_path);

lang

1$thumbnail_real_path = $file_dir . $thumbnail_name;

$thumbnail_real_path(実パス)を使わないとだめかなと。

投稿2015/05/04 02:36

kiri

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

okame

2015/05/04 05:22

回答ありがとうございます! ご教示頂いた内容で修正してみたところ、 サムネイル画像は指定したディレクトリに保存されたのですが、 サイズが元のままで、かつエラーが出てしまいました。。。 ■画像出力画面------------------------------------ <html> <head> <title>PHPのテスト</title> </head> <body> <?php $resizeX = 50; $thumbnail_name = "thumbnail.jpg"; $file_dir = '/Applications/XAMPP/xamppfiles/htdocs/test/img/'; $file_path = $file_dir.$_FILES['uploadfile']['name']; if (move_uploaded_file($_FILES['uploadfile']['tmp_name'], $file_path)) { $img_dir = '/test/img/'; $img_path = $img_dir.$_FILES['uploadfile']['name']; $thumbnail_path = $img_dir.$thumbnail_name; $thumbnail_real_path = $file_dir.$$thumbnail_name; //$thumbnail_path = $img_dir.$thumbnail_name; if (mb_strpos($_FILES['uploadfile']['type'], 'jpeg')) { $gdimg_in = imagecreatefromjpeg($file_path); $ix = imagesx($gdimg_in); $iy = imagesy($gdimg_in); $ox = $resizeX; $oy = ($ox * $iy) / $ix; $gdimg_out = imagecreatetruecolor($ox, $oy); imagecopyresized($gdimg_out, $gdimg_in, 0, 0, 0, 0, $ox, $oy, $ix, $iy); imagejpeg($gdimg_out, $thumbnail_real_path); imagedestroy($gdimg_in); imagedestroy($gdimg_out); $size = getimagesize($file_path); $size2 = getimagesize($thumbnail_real_path); ?> ファイルアップロードを完了しました。<br> <img src="<?=$img_path ?>" <?=$size[3] ?>><br> <img src="<?=$thumbnail_path?>" <?=$size2[3]?>><br> <b><?=$_POST['comment']?></b><br> <?php } else { echo 'JPEG形式の画像をアップロードしてください。<br>'; } } else { echo '正常にアップロード処理されませんでした。<br>'; } ?> </body> </html> /* 出力結果 Notice: Undefined variable: thumbnail.jpg in /Applications/XAMPP/xamppfiles/htdocs/test/view.php on line 19 Warning: imagejpeg(/Applications/XAMPP/xamppfiles/htdocs/test/img/): failed to open stream: Is a directory in /Applications/XAMPP/xamppfiles/htdocs/test/view.php on line 31 Notice: getimagesize(): Read error! in /Applications/XAMPP/xamppfiles/htdocs/test/view.php on line 36 ファイルアップロードを完了しました。 (以下、アップロードした画像が二つ並び、どちらも元のサイズのままでした) 上記について改めて頂ければ幸いです。
kiri

2015/05/04 05:26

$thumbnail_real_path = $file_dir.$$thumbnail_name; ↑ $$ってなってますけど、実際は$はひとつですか?
okame

2015/05/04 05:45

あっ!。。。大変失礼いたしました!!m(_ _)m ご指摘頂いた$を一つにしたらサイズが変更されたサムネイル画像が出力されました。 本当にありがとうございました!!!m(_ _)m
kiri

2015/05/04 05:51

よかったです^^
guest

0

うーん、だいたい合っているように思えますねえ。どこでコケてるんだろう...

lang

1 $gdimg_in = imagecreatefromjpeg($file_path);

とありますが、imagecreatefromjpegの結果である$gdimg_inの値が検査されていません。失敗時にはFALSEが返ることになっていますから、値がFALSEであるかどうかを検査すべきだと思います。同様のことは、imagecopyresized、imagejpegについても言えます。どこで失敗しているのか確認して、原因を突き止めていきましょう。

投稿2015/05/02 23:26

chokojori

総合スコア973

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

okame

2015/05/03 01:00

いつもありがとうございます!m(_ _)m ご教示頂いた3つの値の検査を行ってみました(それぞれ別々に実行)。 imagejpegがさきほどと同じ状況で、ほか2つは問題ないようです。 $gdimg_in = imagecreatefromjpeg($file_path); if($gdimg_in === false) { echo 'false!'; } else { echo 'Not false...'; } // 出力結果:Not false... if (imagecopyresized($gdimg_out, $gdimg_in, 0, 0, 0, 0, $ox, $oy, $ix, $iy) === false) { echo 'false!'; } else { echo 'Not false...'; } // 出力結果:Not false... if (imagejpeg($gdimg_out, $thumbnail_path) === false) { echo 'false!'; } else { echo 'Not false...'; } /* 出力結果: Warning: imagejpeg(/test/img/thumbnail.jpg): failed to open stream: No such file or directory in /Applications/XAMPP/xamppfiles/htdocs/test/view.php on line 29 false! */ という結果です。改めてご教示いただければ幸いです。
chokojori

2015/05/03 01:14

/test/imgというディレクトリは存在しているんですよね? /testと/test/imgの両方の所有者とパーミッションを確認してください。
okame

2015/05/03 02:20

はい。/test/imgは存在していて、元画像自体はファイルアップロードできちんと格納されます。 パーミッションも確認済で/test及び/test/imgで読み書きOKにしています。 。。。あっ!今サムネイル元の格納されている画像ファイルのパーミッションを確認したら、 「読み出しのみ」になっているのに気づきました。これが原因でしょうか? アップロード元のディレクトリ及びファイルとアップロード先のディレクトリは読み書きOKで、 アップロード後にその画像ファイルは読み出しのみになってしまっている状況です。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問