人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP

投稿された画像を指定した大きさに変換し、名前をつけて指定したディレクトリに保存するPHPプログラムの作成をお願いいたします。

画像の大きさですが変数の値を変えれば変換できるようにしておいてください。保存先のディレクトリも同様にお願いいたします。

また、投稿される画像の保存形式は問わない形にします。ただサーバー上ではJPEGでお願いいたします。また、保存する際の画像名ですが$useridに投稿するユーザー名が代入されていますので、$userid".jpeg"のような感じでお願いいたします。

そのほかにも既に同じ名前の画像がある場合、上書きするような感じでお願いいたします。

又、可能でしたら画像の大きさ以外に画像の容量の大きさも指定できたり簡単なセキュリティ機能をつけて頂けると幸いです。

よろしくお願いいたします。

●質問者: esecua
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:.jp JPEG PHP サーバー セキュリティ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ●
●35ポイント ベストアンサー

簡単なものを書いてみました。

お試しください。

セキュリティについてはほとんど考慮できていませんので、そのあたりは他の方におまかせしたいと思います。

このサンプルが良い踏み台になれば幸いです。

<?php
// 変数設定 (セッションやPOSTの内容から取得?)
$userid = 'bonlife';
// 以下のディレクトリが存在し、書き込める設定になっている必要あり
$img_store_dir = './resized_img/';
$resized_img_filename = $img_store_dir . $userid . ".jpg"; // 出力ファイル名設定
$max_file_size = '1000000'; // ファイル最大サイズの設定
$errors = array(); // エラー情報格納用配列の初期化
// HTML出力用設定
mb_http_output('UTF-8');
header("Content-Type: text/html; charset=UTF-8");
// HTMLのヘッダー部分出力
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>画像リサイズサンプル</title>
</head>
<body>
<form name="form1" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="POST" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" />
Please select image file you want to upload : <input type="file" name="up_filename" size="30" /> (MAX 1,000,000 byte)<br />
Width : <input type="text" name="width" size="5" /> pixel (MAX 1,024 byte)<br />
Height : <input type="text" name="height" size="5" /> pixel (MAX 1,024 byte)<br />
<input type="submit" name="submit" value="Upload and Resize" />
</form>
<?php
// POST内容の保存、簡易チェック
$up_filename = $_FILES['up_filename']['tmp_name'];
$file_size = $_FILES['up_filename']['size'];
$width = mb_convert_kana($_POST['width'],"as",UTF8);
$height = mb_convert_kana($_POST['height'],"as",UTF8);
if ($file_size > $max_file_size ) {
$errors[] = "\tFile size is too large.<br />\n";
}
if ( ! preg_match('/^[0-9]{0,5}$/',$width )) {
$errors[] = "\tWidth is wrong.<br />\n";
}
if ( ! preg_match('/^[0-9]{0,5}$/',$height )) {
$errors[] = "\tHeight is wrong.<br />\n";
}
if ( $width > 1024 ) {
$errors[] = "\tWidth is too large.<br />\n";
}
if ( $height > 1024 ) {
$errors[] = "\tHeight is too large.<br />\n";
}
/*
 画像サイズは指定させずに変数として持つことももちろん可能
*/
// 画像タイプの判定、処理分岐
if ( count($errors) == 0 ) {
if (is_uploaded_file($up_filename)) {
$imgtype = exif_imagetype($up_filename);
switch ($imgtype) {
case '1' :
print "\tOriginal image type is GIF.<br />\n";
$im = @imagecreatefromgif($up_filename);
resize_img_to_jpg($up_filename,$im,$width,$height,$resized_img_filename);
break;
case '2' :
print "\tOriginal image type is JPEG.<br />\n";
$im = @imagecreatefromjpeg($up_filename);
resize_img_to_jpg($up_filename,$im,$width,$height,$resized_img_filename);
break;
case '3' :
print "\tOriginal image type is PNG.<br />\n";
$im = @imagecreatefrompng($up_filename);
resize_img_to_jpg($up_filename,$im,$width,$height,$resized_img_filename);
break;
default :
print "\tFile type is NOT SUPPORTED. (GIF, JPEG, PNG Only)<br />\n";
break;
}
}
} else {
foreach ($errors as $error) {
print "\t$error\n";
}
}
// 画像のリサイズ
function resize_img_to_jpg($up_filename,$im,$width,$height,$resized_img_filename) {
list($org_width,$org_height,$org_type,$org_attr)=getimagesize($up_filename);
print "\tWIDTH of original file : $org_width<br />\n";
print "\tHEIGHT of original file : $org_height<br />\n";
print "\tWIDTH of new file : $width<br />\n";
print "\tHEIGHT of new file : $height<br />\n";
if (! $im) {
print "\tError loading $up_filename.<br />\n";
imagedestroy($im);
} else {
$resized_img = imagecreatetruecolor($width, $height);
imagecopyresampled($resized_img, $im, 0, 0, 0, 0, $width, $height, $org_width, $org_height);
imagejpeg($resized_img, $resized_img_filename, 100);
imagedestroy($im);
imagedestroy($resized_img);
print "\tResizing succeeded. (" . basename($resized_img_filename) . ")<br />\n";
print "\t<img src=\"$resized_img_filename\" />\n";
}
}
// HTMLのフッター部分出力
print <<<EOF
</body>
</html>
EOF;
?>

ユーザ指定で画像の縦横比を維持したリサイズを行いたい場合、以下のような工夫をする必要がありますのでご注意ください。

また、Uploadされたテンポラリファイルの扱いについては以下のURLを参考にしてみてください。

参考になれば幸いです。

◎質問者からの返答

ご回答ありがとうございます。

自鯖で試してみたのですが、なかなか動いてはくれません。保存先のフォルダもスクリプトと同じフォルダ内に作成しパーミッションも777に設定しましたがダメでした。各チェック機能はOKのようでwidthなどに数字以外を入力すとエラーメッセージが表示されます。しかしそれ以後は初めの表示に戻ってしまい

print "\tResizing succeeded. (" . basename($resized_img_filename) . ")
\n";

print "\t<img src=\"$resized_img_filename\" />\n";

などは表示されません。

よろしくお願いいたします。


2 ●
●35ポイント

GDという画像を扱うためのライブラリがインストールされていない(あるいはインストールされているが有効になっていない)のではないでしょうか。

phpinfogd_infoで確認してみてください。

[参考URL]

また、使える関数がPHPのバージョン(つまりGDのバージョン)によって異なりますので、ご注意ください。

バージョンによってはGIFをサポートしていないものもあります。

参考になれば幸いです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ