• ベストアンサー

画像のアップロードができない

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 をダウンロードした方がよいと  記載がありました。関係ありますでしょうか。 どなたかお分かりになる方がいらっしゃいましたらどうか ご教授いただけませんでしょうか。 お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.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; こんな感じでどうでしょうか。

ham64600
質問者

お礼

ありがとうございました。 いただいたソースに修正させていただいたところ 無事.gif .jpgなどの拡張子がついた名前でアップロードできました。 本当にありがとうございました。

その他の回答 (1)

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

tempnam()で画像の保存パスを決めているからですね。 これは一意のファイル名(とファイル)を作成する関数で、保存しようとしているファイルの形式が何かということとは何の関係もありません。 http://jp.php.net/manual/ja/function.tempnam.php 任意の名前で保存したければそのようにコーディングする必要があります。

ham64600
質問者

お礼

UmJammer様 早速ご回答いただきましてありがとうございます! いつも的確に教えていただきまして本当に感謝しております。 tempnam()の設定が間違っているのでしょうか。 ファイル名は一意のものでいいのですが 拡張子は 投稿ファイルがgifであればgif pngであればpng jpegであればjpeg をファイル名の後につけたいのですが その場合、どこを変更すればよろしいのでしょうか。 下記のような設定をおこえばよろしいでのでしょうか http://mashimonator.weblike.jp/blog/2008/12/phppost.html

関連するQ&A