• ベストアンサー

画像のアップロード

はじめまして。本を参考にphp4.3.11&MYSQLによる画像のアップロードについて勉強中の初心者です。 開発はレンタルサーバーで行っています。 画像のアップロードに関して下記プログラムを設定しているのですが、 エラーが表示されて画像のアップロードができません。 ■設定したitem2.php 内のソースです。 require( '../config.php' ); // 写真アップロード $path_parts = pathinfo( $_FILES['userfile']['name'] ); $uploadfile = $item_image_dir . $item_id . '.' . strtolower( $path_parts['extension'] ); if ( move_uploaded_file( $_FILES['userfile']['tmp_name'], $uploadfile ) ) { chmod( $uploadfile, 0777 ); $sql = "update item set image_url ='" . $item_image_url . $item_id . '.' . strtolower( $path_parts['extension'] ) . "' where item_id = '$item_id'"; $result = mysql_query( $sql ); } ■外部参照している../config.php 内の記述です。 $item_image_dir = '/var/www/****/htdocs/image/item/'; $item_image_url = '/image/item/'; ▼エラー内容です。 Warning: move_uploaded_file(home/****/public_html/image/item/0.gif) [function.move-uploaded-file]: failed to open stream: No such file or directory in /home/****/public_html/admin/item2.php on line 68 Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpov0Fqr' to 'home/****/public_html/image/item/0.gif' in /home/****/public_html/admin/item2.php on line 68 image/itemのパラメータは777に設定しております。 どなたか原因お分かりになられる方がいらっしゃったらどうかお教え ください。ご不明な点などございましたら是非ご指摘ください。 どうぞよろしくお願いいたします。

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

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.6

$path_parts=$_FILES['userfile']['name'] ); $uploadfile = preg_replace('/^(.*)(\.\w+)$/', "{$item_id}\$2", $path_parts); で、うまくいきません? $item_idは、定義済みですよね?

ham64600
質問者

お礼

お返事いただきまして誠にありがとうございます! $path_parts=$_FILES['userfile']['name'] ); $uploadfile = preg_replace('/^(.*)(\.\w+)$/', "{$item_id}\$2", $path_parts); 上記で設定しましたところ、先述しましたエラーが表示されて しまいます。 > $item_idは、定義済みですよね? item_idはauto_incrementで自動で割り振られるIDになります。 1,2,3,4・・・と自動で割り振られます。 なぜエラーになってしまうのでしょうか。 その他こちらからご提示すべき情報ございましたら是非 ご連絡ください。どうかよろしくお願いいたします。

その他の回答 (6)

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.7

$uploadfile = $item_image_dir . $item_id . '.' . strtolower( $path_parts['extension'] ); の後に var_dump($uploadfile); var_dump($_FILES); exit(); を入れて、実行して画面のソースコードを表示してみてください。

ham64600
質問者

お礼

ご回答ありがとうございます! 本当に何度もすみません。感謝しております。 上記コードをいれたところ、下記のようなソースコードが 表示されました。 string(17) "../image/item/34." array(1) { ["userfile"]=> array(5) { ["name"]=> string(7) "pic.gif" ["type"]=> string(9) "image/gif" ["tmp_name"]=> string(14) "/tmp/phpRL02iI" ["error"]=> int(0) ["size"]=> int(5686) } } アップロードしようとしたのはpic.gifでございます。 どうぞよろしくお願いいたします。

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.5

こんなので、どうでしょう? $uploadfile = preg_replace('/^(.*)(\.\w+)$/', "{$item_id}\$2", $path_parts);

ham64600
質問者

お礼

ソースをお教えいただきまして誠にありがとうございます。 ご回答いただき誠に感謝しております。 お教えいただいたソースはどの部分に上書きすればよろしかった でしょうか。 $uploadfile = $item_image_dir . $item_id . '.' . strtolower( $path_parts['extension'] ); 元のソースの上記箇所に上書きしますと 下記エラーが表示され、画像のアップロードができません。 (パーミッション拒否ということでしょうか 画像の入るディレクトリimage/item のitemは777に設定しているのですが。。) Warning: move_uploaded_file(Array) [function.move-uploaded-file]: failed to open stream: Permission denied Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpURz9uR' to 'Array' 何度も誠に申し訳ございません。 どうかお教えいただけますと幸いです。

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.4

$path_parts['extension'] って何でしょう? たとえば、clockRing.gifと言うのをアップロードすると、$_FILESには次のような内容が入ります。 nameのところに、拡張子付きの名前がそのまま入っています。 array(1) { ["upfile"]=> array(5) { ["name"]=> string(13) "clockRing.gif" ["type"]=> string(9) "image/gif" ["tmp_name"]=> string(27) "C:\Windows\Temp\phpE17B.tmp" ["error"]=> int(0) ["size"]=> int(12609) } }

ham64600
質問者

お礼

ご回答・ご教授いただきまして誠にありがとうございます! >$path_parts['extension'] って何でしょう? 本に記載されていたコードでございますが、おそらく筆者は ['extension'] =拡張子を意図していたのでしょうか。 >nameのところに、拡張子付きの名前がそのまま入っています。 なるほど、拡張子ごと名前が変更されていたのですね。 とすると、clockRing のみ(入力フォームに 入力された拡張子はそのままに、ファイル名のみ) 変更するにはどのようにコードを書き換えればよろしいのでしょうか。 お教えいただいたものを参考にいろいろ変更してみましたが どうしても分かりません。 どなたかお分かりになられる方がいらっしゃったら お教えいただけますと誠に助かります。何卒 よろしくお願い申し上げます。

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.3

多分、1つのサーバー上で、分譲しているタイプですね。 ****の部分は~****ですか? その場合、ユーザーが使えるのは、ユーザ名がhogeだとすると、 /home/~hoge/ 以下です。 また、Webで表示したりできるのは、 /home/~hoge/public_html 以下です。 /var の下をユーザーが勝手にいじってはいけません。 自分のpublic_htmlの下にディレクトリを作って、そこに移してください。

ham64600
質問者

お礼

ありがとうございました!画像のアップロードができました! これだけ騒いで絶対パスの間違いとは。。 申し訳ございません。お教えいただいて誠に感謝しております。 ただ、問題がまた新たに1つできました。 現在item_idでアップロードされたファイルのファイル名が付けられるようになっているのですが、 (例えばitem_id=15であれば15.jpg、15.gifなど…) アップロードされたファイルをみると 15. で拡張子の部分が消えていて表示ができません。 個人的にはアップロードされた拡張子がそのまま つくように設定したいのですが、どうすればよろしいでしょうか。 どなたかお分かりになられる方がいらっしゃったらお教え いただけますと大変たすかります。

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

パラメータって書いてるのは、パーミッションの事ですね。 用語を間違うと、他人に伝わらないので正確に覚えるようにしてくださいね。 >>1.そもそもアップロードは成功しているのですか >アップロードは成功しておりません。リモート側のディレクトリにアップロードされておりません。 そりゃ、どうしようもない。 アップされたファイルを操作するPHPプログラムコードをいくらいじっても、アップされていないファイルをどうにもすることができませんね。 http://www.php.net/manual/ja/features.file-upload.errors.php 上記あたりを調べて、なぜアップロードされないのか確認する必要がありますね。 もしかすると、セキュリティなどの関係で、レンタルサーバー側でHTML上のファイルアップロードを禁止している可能性もあるのかも知れません。

ham64600
質問者

お礼

夜分にも関わらずご回答いただきましてありがとうございます。 >パラメータって書いてるのは、パーミッションの事ですね。 おっしゃるとうりです。すみません、以後気をつけます。 >上記あたりを調べて、なぜアップロードされないのか確認する >必要がありますね。 $_FILES['userfile']['error'] 上記ですが、どのように設定すればよろしいでしょうか。 誠に恐縮ですが、なにぶん初心者なもので、お教えいただけますと幸いです。 >もしかすると、セキュリティなどの関係で、レンタルサーバー側で>HTML上のファイルアップロードを禁止している可能性もあるのかも >知れません。 こちら本日中にレンタルサーバー会社に問合せてみます。 ご回答いただき本当にありがとうございました。

  • mpx
  • ベストアンサー率71% (149/209)
回答No.1

いろいろ考えられますが 1.そもそもアップロードは成功しているのですか  $_FILES['userfile']['error']を先にチェックをすべきです 2.フォルダーがおかしく有りませんか >> $item_image_dir = '/var/www/****/htdocs/image/item/'; なのに、エラーメッセージは >> Warning: move_uploaded_file(home/****/public_html/image/item/0.gif) 開示されているソースが間違っていませんか 余分な文字(空白など)も要チェック >> image/itemのパラメータは777に設定しております home/****/public_html/image/item/ このフォルダを777にしましょう

ham64600
質問者

補足

早速のご回答、誠にありがとうございます。 >1.そもそもアップロードは成功しているのですか アップロードは成功しておりません。リモート側のディレクトリに アップロードされておりません。 >2.フォルダーがおかしく有りませんか おっしゃるとうりです。私の方でも $item_image_dir = の設定をいろいろ変更してみたのですが 変更しましても >> Warning: move_uploaded_file(home/****/public_html/image/item/0.gif) とエラー表示されてしまいます。 >home/****/public_html/image/item/ このフォルダを777にしましょう 上記777に設定しております。 ちなみにNextFTPを使ってパラメータを変更しました。 どうぞよろしくお願いいたします。

関連するQ&A