- ベストアンサー
画像のアップロードができない
PHPで携帯サイトを制作中なのですが、メールで画像をアップロードする ことができずに困っております。 具体的にはサーバーにファイル自体はアップロードされるのですが img配下を見ると「ev4rVY(エンコードされたファイル名)」がサーバーにアップされているものの、拡張子がついていないのです。 ▼画像アップロードプログラムPHPソース // ユーザー&認証コードチェック if ($user&&$auth_code==getAuthCode($user['id'], $user['auth_string'])) { // 認証OK // マルチパートの場合のみメールを解析して画像を取得 if (strtolower($structure->ctype_primary) == "multipart") { $images = getImage($structure->parts); } $image_save_path = null; // 画像リストの中から1つだけ画像を取得する foreach ($images as $image) { // コンテンツタイプのチェック if ($image['type'] == 'image/jpeg' || $image['type'] == 'image/gif' || $image['type'] == 'image/png') { // ファイルとして保存 // 一時ファイルパス $temp_path = tempnam('/tmp', 'img_'); if ($temp_path == false) { // error break; } $fp = fopen($temp_path, 'w'); if ($fp == false) { // error break; } fwrite($fp, $image['body']); fclose($fp); // 画像の形式と縦横サイズを取得 list($width, $height, $type) = getimagesize($temp_path); // 認識できる形式であれば、所定のメソッドで開く $imageSource = null; if ($type == IMAGETYPE_GIF) { $imageSource = imagecreatefromgif($temp_path); } else if ($type == IMAGETYPE_JPEG) { $imageSource = imagecreatefromjpeg($temp_path); } else if ($type == IMAGETYPE_PNG) { $imageSource = imagecreatefrompng($temp_path); } // 一時ファイルを消す unlink($temp_path); if ($imageSource) { // ファイル名決定 $path = tempnam($image_dir, ''); //unlink($path); $image_save_path = $path; // 画像をケータイディレクトリへファイル保存 imagejpeg($imageSource, $image_save_path); imagedestroy($imageSource); break; } } } ▲以上ここまで━━━━━━━━━━━━━━━━━━━━━━━━━ 開発環境:CentOS5 PHP Version 5.2.11 ※本を参考に制作しているのですが 本にはGD Graphics をダウンロードした方がよいと 記載がありました。関係ありますでしょうか。 どなたかお分かりになる方がいらっしゃいましたらどうか ご教授いただけませんでしょうか。 お願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 $ext = ".jpg"; $imageSource = null; if ($type == IMAGETYPE_GIF) { $imageSource = imagecreatefromgif($temp_path); $ext = ".gif"; } else if ($type == IMAGETYPE_JPEG) { $imageSource = imagecreatefromjpeg($temp_path); } else if ($type == IMAGETYPE_PNG) { $imageSource = imagecreatefrompng($temp_path); $ext = ".png"; } //省略 $path = tempnam($image_dir, ''); $image_save_path = $path . $ext; こんな感じでどうでしょうか。
その他の回答 (1)
- UmJammer
- ベストアンサー率58% (115/196)
tempnam()で画像の保存パスを決めているからですね。 これは一意のファイル名(とファイル)を作成する関数で、保存しようとしているファイルの形式が何かということとは何の関係もありません。 http://jp.php.net/manual/ja/function.tempnam.php 任意の名前で保存したければそのようにコーディングする必要があります。
お礼
UmJammer様 早速ご回答いただきましてありがとうございます! いつも的確に教えていただきまして本当に感謝しております。 tempnam()の設定が間違っているのでしょうか。 ファイル名は一意のものでいいのですが 拡張子は 投稿ファイルがgifであればgif pngであればpng jpegであればjpeg をファイル名の後につけたいのですが その場合、どこを変更すればよろしいのでしょうか。 下記のような設定をおこえばよろしいでのでしょうか http://mashimonator.weblike.jp/blog/2008/12/phppost.html
お礼
ありがとうございました。 いただいたソースに修正させていただいたところ 無事.gif .jpgなどの拡張子がついた名前でアップロードできました。 本当にありがとうございました。