(PHP)http://q.hatena.ne.jp/1142042592 にて質問しましたが、解決に至らなかったため再度質問します。


http://q.hatena.ne.jp/1142042592 での回答を参考に何回かトライしましたが、だめでした。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2006/03/13 22:48:41
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:bonlife No.2

回答回数421ベストアンサー獲得回数75

ポイント70pt

度々失礼いたします。

前回の私の回答は適切ではありませんでした。

なんとなく違和感があったのですが、そのまま回答してしまいました。

申し訳ありません。

imagejpeg()で画像$im_outを一度ファイルに出力し、そのファイルをfopen()、fread()すればご要望の機能を実現できます。

(一度ファイルにするのがダサいのですが、他のやり方が分かりませんでした…。)

例としては、imagecopyresized()の後、以下のようなソースを書き足すと良いはずです。

元のソースの$fpで始まる行からmysql_real_escape_string()を含む行を以下の内容に変更すれば動くはずです。

(サンプルで稼動確認しました。)

// リサイズ後のファイル名を決定
	$resized_img_file_name = $_FILES["upfile"]["tmp_name"] . "_after_resize" ;
// imagejpeg()で$im_outをファイルに落とす
	imagejpeg($im_out, $resized_img_file_name);
// 画像ファイルをバイナリデータとして読み込む
	$fp = fopen ($resized_img_file_name, "rb");
	if(!$fp)
	{
		print("リサイズした画像ファイルを開けませんでした");
		exit;
	}
	$resized_image = fread($fp, filesize($resized_img_file_name));
	fclose($fp);
// リサイズ後の画像ファイルを削除
	unlink($resized_img_file_name);
// SQL用に特殊文字をエスケープ
	$resized_image = mysql_real_escape_string($resized_image);

後は、$resized_imageをSQLのINSERTでDBに挿入すれば良いはずです。

(テーブルの構成が分からなかったため、SQLは修正していません。)

また、mysql_real_escape_string()を使っていれば、addslashes()は不要だと思います。

重複して利用すると問題があったはずです。

(このあたりは定かではありませんので、色々と試してみてください。)

DBの選択までは、「esecuaの日記」上で公開されているソースに記載されていない部分で完了している前提で書きました。

参考になれば幸いです。

もし上手くいかなかった場合、どう上手く行かないのかをコメントでつけてくだされば、時間がある時に改善案を考えてみます。

id:esecua

以前に続きご丁寧な回答ありがとうございます。

ご回答のソースでリサイズ、データベースの格納、表示などできました。ありがとうございます。

2006/03/13 23:44:54

その他の回答3件)

id:jouno No.1

回答回数280ベストアンサー獲得回数0

ポイント10pt

とりあえず何回か回答できるようなので、こちらに再現環境はないのですが、ソースだけ見て回答してみます。

失敗した場合エラーメッセージをそのまま載せていただけるとほかの方も回答しやすいと思うのでよろしくお願いします。引用符がはてなの表示で変換されている場合は半角に戻してください。

if (is_uploaded_file($_FILES['UpFile']['tmp_name'])) {

if ( mb_strpos($_FILES['UpFile']['type'], 'jpeg') ) {

// JPEG画像を読み込む

$im_inp = ImageCreateFromJPEG($_FILES['UpFile']['tmp_name']);

$ix = ImageSX($im_inp); // 読み込んだ画像の横サイズを取得

$iy = ImageSY($im_inp); // 読み込んだ画像の縦サイズを取得

$ox = $resizeX; // サイズ変更後の横サイズ

$oy = $ox;

// サイズ変更後の画像データを生成

$im_out = ImageCreateTrueColor($ox, $oy);

imagecopyresized($im_out,$im_inp,0,0,0,0,$ox,$oy,$ix,$iy);

$im_out = addslashes($im_out);

$im_out = mysql_real_escape_string($im_out);

$sql = "INSERT INTO `hatena` VALUES `gazou` = '".$im_out."' WHERE `number` = '".$yournumber."';";

mysql_query($sql,$con);

echo"アップデート完了!";

// メモリーの解放

ImageDestroy($im_inp);

ImageDestroy($im_out);

exit;

} //jpeg

} //is_uploaded?

id:esecua

その方法でトライしてみましたが、データベースに格納できているものの、表示すると Resource id #数字 と表示され、画像ファイルが表示できないのです。

2006/03/13 22:31:49
id:bonlife No.2

回答回数421ベストアンサー獲得回数75ここでベストアンサー

ポイント70pt

度々失礼いたします。

前回の私の回答は適切ではありませんでした。

なんとなく違和感があったのですが、そのまま回答してしまいました。

申し訳ありません。

imagejpeg()で画像$im_outを一度ファイルに出力し、そのファイルをfopen()、fread()すればご要望の機能を実現できます。

(一度ファイルにするのがダサいのですが、他のやり方が分かりませんでした…。)

例としては、imagecopyresized()の後、以下のようなソースを書き足すと良いはずです。

元のソースの$fpで始まる行からmysql_real_escape_string()を含む行を以下の内容に変更すれば動くはずです。

(サンプルで稼動確認しました。)

// リサイズ後のファイル名を決定
	$resized_img_file_name = $_FILES["upfile"]["tmp_name"] . "_after_resize" ;
// imagejpeg()で$im_outをファイルに落とす
	imagejpeg($im_out, $resized_img_file_name);
// 画像ファイルをバイナリデータとして読み込む
	$fp = fopen ($resized_img_file_name, "rb");
	if(!$fp)
	{
		print("リサイズした画像ファイルを開けませんでした");
		exit;
	}
	$resized_image = fread($fp, filesize($resized_img_file_name));
	fclose($fp);
// リサイズ後の画像ファイルを削除
	unlink($resized_img_file_name);
// SQL用に特殊文字をエスケープ
	$resized_image = mysql_real_escape_string($resized_image);

後は、$resized_imageをSQLのINSERTでDBに挿入すれば良いはずです。

(テーブルの構成が分からなかったため、SQLは修正していません。)

また、mysql_real_escape_string()を使っていれば、addslashes()は不要だと思います。

重複して利用すると問題があったはずです。

(このあたりは定かではありませんので、色々と試してみてください。)

DBの選択までは、「esecuaの日記」上で公開されているソースに記載されていない部分で完了している前提で書きました。

参考になれば幸いです。

もし上手くいかなかった場合、どう上手く行かないのかをコメントでつけてくだされば、時間がある時に改善案を考えてみます。

id:esecua

以前に続きご丁寧な回答ありがとうございます。

ご回答のソースでリサイズ、データベースの格納、表示などできました。ありがとうございます。

2006/03/13 23:44:54
id:bonlife No.3

回答回数421ベストアンサー獲得回数75

度々失礼いたします。

前回の私の回答は適切ではありませんでした。

なんとなく違和感があったのですが、そのまま回答してしまいました。

申し訳ありません。

imagejpeg()で画像$im_outを一度ファイルに出力し、そのファイルをfopen()、fread()すればご要望の機能を実現できます。

(一度ファイルにするのがダサいのですが、他のやり方が分かりませんでした…。)

例としては、imagecopyresized()の後、以下のようなソースを書き足すと良いはずです。

元のソースの$fpで始まる行からmysql_real_escape_string()を含む行を以下の内容に変更すれば動くはずです。

(サンプルで稼動確認しました。)

// リサイズ後のファイル名を決定
	$resized_img_file_name = $_FILES["upfile"]["tmp_name"] . "_after_resize" ;
// imagejpeg()で$im_outをファイルに落とす
	imagejpeg($im_out, $resized_img_file_name);
// 画像ファイルをバイナリデータとして読み込む
	$fp = fopen ($resized_img_file_name, "rb");
	if(!$fp)
	{
		print("リサイズした画像ファイルを開けませんでした");
		exit;
	}
	$resized_image = fread($fp, filesize($resized_img_file_name));
	fclose($fp);
// リサイズ後の画像ファイルを削除
	unlink($resized_img_file_name);
// SQL用に特殊文字をエスケープ
	$resized_image = mysql_real_escape_string($resized_image);

後は、$resized_imageをSQLのINSERTでDBに挿入すれば良いはずです。

(テーブルの構成が分からなかったため、SQLは修正していません。)

また、mysql_real_escape_string()を使っていれば、addslashes()は不要だと思います。

重複して利用すると問題があったはずです。

(このあたりは定かではありませんので、色々と試してみてください。)

DBの選択までは、「esecuaの日記」上で公開されているソースに記載されていない部分で完了している前提で書きました。

参考になれば幸いです。

もし上手くいかなかった場合、どう上手く行かないのかをコメントでつけてくだされば、時間がある時に改善案を考えてみます。

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 421 401 75 2006-03-13 21:07:56
  • id:bonlife
    何度も同じ回答をつけてしまって申し訳ありませんでした。

    1点追加で注意事項がありますので、コメントで書いておきます。

    http://dev.mysql.com/doc/refman/4.1/ja/tips.html

    >>
    通常の Web サーバセットアップを使用する場合は、画像をファイルとして格納する。言い換えると、データベース内にはファイル参照のみを格納する。この主な理由は、通常の Web サーバのほうがデータベースコンテンツと比較してファイルのキャッシュに優れているためである。このため、ファイルを使用したほうがシステムの高速化を容易に図れる。
    <<

    上記の説明のように、画像はファイルとして保存しておき、そのURLをDBに保持しておく方が速度面で優れているようです。
    速度を追求するのであれば、改変してみてください。

    ファイルとそのファイルのURLという2つのものを管理するよりも、画像をDBに直接保存する方が管理面ではスッキリしていますし、アクセス制限なども行いやすいと思います。

この質問への反応(ブックマークコメント)

トラックバック

  • 風呂上りに人力検索はてなでオオボケ回答(http://q.hatena.ne.jp/1142260879)してしまって、訂正しようと思ってたら「まさに」な回答がついていて恥ずかしい思いをしているbonlifeです。まぁ、いっ
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません