ファイルアップロード・サムネイル生成でハマる
- 2009年3月1日 14時13分
- [PHP]
サムネイル生成を作っているときにハマったのでメモ。
2MB以上の画像アップロードできない現象が発生!
ああ、なるほど、upload_max_filesizeがアレなんだな(独り言)。
upload_max_filesize
post_max_size
momory_limit
このあたりの数値を上げて、再度試すがアップロードできない。
なんだかimagecreatefromjpegあたりでひっかっかているっぽい。うーん、これはGDの限界なのか。なんだか1600*1200ピクセル程度の画像でエラーが出ているってサイトもあるなあ。
でも、アップロードに成功したファイルは2592*1944ピクセルで、失敗したファイルは2896*1944ピクセル。デジカメの撮りっぱなしファイル程度をアップロードできないのは仕様としてどうなのよ。と思いつつ、なんでだろ、なんでだろ、としばらく悩む。
画像をPhotoshopで開いてみても、特に問題ない。300dbiってのが気になるけれども単にサイズが大きめなだけ。
それじゃあ、ということで、GDを通さないで、単純にアップロードするだけにしてみる。
これも失敗。状況は変わらず、アップロードできない画像がある。php.iniを直接変更してApacheを再起動している状況でもあるわけで、問題はphp.iniの設定でもなく、GDの問題でもないなあ、これは。
んで、よくよく見ると、サイズの小さい方の拡張子がjpgで、大きい方がJPG。
!!!!!!。
コードを見ると、小文字の拡張子しか通さないことになってた……orz。
エラーを吐くようにしないとだめぽなり。で、簡単ですが改良してみたのが以下。使っていない変数なんかもありますが、ご参考まで。
<?php
//初期化
$photo = '';
//設定
define('PATH', '/upload/image/');
define('URL', 'http://localhost/upload/');
/*****************************************
* ファイル名変更
* てきとーにsha1で変えてみる
*/
function change_filename ($file, $path, $ext)
{
$rename = sha1(microtime()) . '.' . $ext;
rename($file, $path . $rename);
return $rename;
}
/*****************************************
* サムネイル生成
*/
function create_thumb ($file, $path, $thumb_path, $width)
{
global $created_file;
if (preg_match('/[.](jpg)|(jpeg)$/i', $file))
{
$image = imagecreatefromjpeg($path . $file);
}
elseif (preg_match('/[.](gif)$/i', $file))
{
$image = imagecreatefromgif($path . $file);
}
elseif (preg_match('/[.](png)$/i', $file))
{
$image = imagecreatefrompng($path . $file);
}
$ox = imagesx($image);
$oy = imagesy($image);
$nx = $width;
$ny = floor($oy * ($width / $ox));
$nm = imagecreatetruecolor($nx, $ny);
imagecopyresampled($nm, $image, 0, 0, 0, 0, $nx, $ny, $ox, $oy);
if(! file_exists($thumb_path))
{
if(! mkdir($thumb_path))
{
die('ディレクトリ生成エラーです(^^;)');
}
}
imagejpeg($nm, $thumb_path . $file, 90);
$created_file = basename($thumb_path . $file);
imagedestroy($nm);
}
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
if (isset($_POST['save']))
{
if (isset($_FILES['photo']))
{
if (preg_match('/[.](jpg)|(jpeg)|(gif)|(png)$/i', $_FILES['photo']['name']))
{
$photo_origin = $_FILES['photo']['name'];
$photo_tmp_name = $_FILES['photo']['tmp_name'];
$photo_error = $_FILES['photo']['error'];
$photo_size = filesize($photo_tmp_name);
$photo_pathinfo = pathinfo($photo_origin);
$photo_extension = $photo_pathinfo['extension'];
move_uploaded_file($photo_tmp_name, PATH . 'original/' . $photo_origin);
$photo_origin = change_filename(PATH . 'original/' . $photo_origin, PATH . 'original/', $photo_extension);
//サムネイル(小)
create_thumb($photo_origin, PATH . 'original/', PATH . 'small/', 200);
$photo_small = $created_file;
//サムネイル(大)
create_thumb($photo_origin, PATH . 'original/', PATH . 'large/', 500);
$photo_large = $created_file;
}
else
{
$error_msg = 'ファイルの拡張子が変です(^^ゞ)';
}
}
}
}
echo '<?xml version="1.0" encoding="utf-8"?>' . "\n" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>画像アップロード・サムネイル生成</title>
</head>
<body>
<h1>画像アップロード・サムネイル生成</h1>
<?php
if (! empty($error_msg))
{
echo '<p>' . $error_msg . '</p>';
}
?>
<form method="post" action="./" enctype="multipart/form-data">
<p>
<?php if (! empty($photo_small) && ! empty($photo_large)) : ?>
<a href="<?php echo URL . 'image/large/' . $photo_small; ?>" target="_blank">
<img src="<?php echo URL . 'image/small/' . $photo_small; ?>" alt="" />
</a>
<?php elseif (empty($photo_small)) : ?>
<input type="file" name="photo" value="<?=$photo;?>" />
<?php endif; ?>
</p>
<?php if (empty($photo_small) && empty($photo_large)) : ?>
<p><input type="submit" name="save" value="✓ アップロードする" /></p>
<?php endif; ?>
</form>
</body>
</html>


2008-2010 maaguu.
コメントを残す