• ベストアンサー

画像のアップロード

はじめまして。本を参考に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に設定しております。 どなたか原因お分かりになられる方がいらっしゃったらどうかお教え ください。ご不明な点などございましたら是非ご指摘ください。 どうぞよろしくお願いいたします。

  • PHP
  • 回答数7
  • ありがとう数7

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

  • ベストアンサー
  • 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

  • PHP 画像のアップロードについて(move_uploaded_file)

    PHP初心者です。画像のアップロード機能を作成中です。 $path="/home/○○○/public_html/admin/w/p/5.jpg" move_uploaded_file($_FILES[MAINPHOTO]['tmp_name'], $path) で画像をアップしようとしたところ、次のエラーが出ます。 Warning: move_uploaded_file(/home/○○○/public_html/admin/w/p/5.jpg) [function.move-uploaded-file]: failed to open stream: Permission denied in /home/○○○/public_html/admin/aaa.php on line 125 Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phptC2x2A' to '/home/○○○/public_html/admin/w/p/5.jpg' in /home/○○○/public_html/admin/aaa.php on line 125 ローカルのadmin以下にw/pフォルダはきちんとあります。そこに5.jpgは存在してません。またアップする画像は別名です。 phpは4.2を使用しています。 サーバーはレンタルのkagoya.netを使用しています。 分かりやすい説明よろしくお願いします。

    • ベストアンサー
    • PHP
  • ファイルのアップロードが、どうしても どうしても 出来ません・・

    ■アップロードフォーム用のHTMLファイルです↓ ファイル名=gazou_upload.html <html> <head> <title>ファイルのアップロード</title> </head> <body> <form method="POST" action="gazou_upload.php" enctype="multipart/form-data"> <input type="hidden" name="max_file_size" value="1000000" > <input type="file" name="userfile"><br><br> <input type="submit" value="アップロード"> </body> </html> ■受け取ったファイルをサーバ上のディレクトリに移動するPHPファイルです↓ ファイル名=gazou_upload.php <?php // アップロード先ディレクトリ+ファイル名の指定 $uploaddir = '/image/'; $uploadfile = $uploaddir. $_FILES['userfile']['name']; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { print "ファイルアップロード成功"; print_r($_FILES); } else { print "ファイルアップロード失敗"."<br>"; print_r($_FILES); } ?> ■結果 Warning: move_uploaded_file(/image/P1010851.jpg): failed to open stream: No such file or directory in /home/sites/lolipop.jp/users/**********/web/gazou_upload.php on line 8 Warning: move_uploaded_file(): Unable to move '/tmp/phpuqa8g2' to '/image/P1010851.jpg' in /home/sites/lolipop.jp/users/***********/web/gazou_upload.php on line 8 ファイルアップロード失敗 Array ( [userfile] => Array ( [name] => P1010851.jpg [type] => image/pjpeg [tmp_name] => /tmp/phpuqa8g2 [error] => 0 [size] => 84509 ) ) 簡単なプログラムなのにちゃんと動作してくれません。色々試行錯誤試したりしているのですが・・初心者で本当に困ってます。どなたかアドバイスよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPでファイルのアップロード

    OSはLinuxのfedoraを利用しており、WebサーバーソフトはApacheを利用しています。 PHPを使って、クライアントからサーバーにファイルのアップロードをしたいのですが、プログラミングがあまり理解できておらず、アップロードができません。ちなみにphp.iniファイルの設定に関しては、アップロードは受け付けるようにしていますし、設定にミスはないと思います。 sample.phpというファイル名で下記のファイルを作ってみたのですが、アップロードすることができませんでした。まだPHPは初心者で間違いだらけだと思うのですが、こうすればアップロードできるようになるといった指摘をお願い致します。 <html> <head> <title> </title> </head> <body> <form enctype="multipart/form-data" action="sample.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> Send this file: <input name="userfile" type="file"> <input type="submit" value="Send File"> </form> <?php if(isset($uploadfile) and is_uploaded_file($uploadfile)) { if(move_uploaded_file($uploadfile, $path . "/var/www/html/test/" . $uploadfile_name)){ print("<br>Uploaded file saved."); }else{ print("<br>Uploaded file save failed."); } } ?> </body> </html>

    • ベストアンサー
    • PHP
  • ファイルアップロードが出来ません。

    phpとApacheを利用して、ファイルのアップロードしたいのですが以下のようなエラーが出て上手くいきません。 エラー文 Warning: move_uploaded_file(C:\Program File\Apache Group\Apache2\htdocs\image\200708090925000.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in C:\Program Files\Apache Group\Apache2\htdocs\view.php on line 12 Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'C:\WINDOWS\Temp\php11.tmp' to 'C:\Program File\Apache Group\Apache2\htdocs\image\200708090925000.jpg' in C:\Program Files\Apache Group\Apache2\htdocs\view.php on line 12 正常にアップロード処理されませんでした。 php.iniの設定はfile_upload=On upload_tmp_dir=NULL upload_max_size=2M です。 phpinfo()で確認したところ、upload_tmp_dirがno valueになっているのですが、設定が反映されていないのでしょうか? 参考までに作成したプログラムを載せておきます。 <HTML> <HEAD> <TITLE>PHPのテキスト</TITLE> </HEAD> <BODY> <?php $file_dir = 'C:\Program File\Apache Group\Apache2\htdocs\image\\'; $file_path = $file_dir.$_FILES["uploadfile"]["name"]; if(move_uploaded_file($_FILES["uploadfile"]["tmp_name"], $file_path)){ $img_dir ="/image/"; $img_path = $img_dir.$_FILES["uploadfile"]["name"]; $size = getimagesize($file_path); ?> ファイルアップロードを完了しました。<BR> <IMG src="<?=$img_path?>"<?=$size[3]?>><BR> <B><?=mb_convert_encoding($_POST["comment"], "EUC-JP","SJIS")?></B><BR> <?php }else{ ?> 正常にアップロード処理されませんでした。<BR> <?php } ?> </BODY> </HTML> 原因が分かる方、ご意見よろしくお願いいたします。

    • 締切済み
    • PHP
  • レンタル共用サーバーでのファイルのアップロードについて

    レンタル共用サーバーでのファイルのアップロードについて、 教えてください。 PHPが、セーフモードで動いているレンタルサーバーで、 ファイルのアップロードを行いたいのですが、 具体的には、どうやればよいのでしょうか。 ローカル環境でファイルアップロードを行っている書籍を、 参考にしているのですが、 ローカル環境から、レンタルサーバー環境への読み替えを どのように行えばよいのかが分かりません。 恐らく、ファイルの移動先($file_dir)を書き換えるのではないか、 と検討をつけたのですが、 ファイルのアップロード自体をやったことがないため、 どう書き換えればよいか分かりません。(絶対パス? 相対パス?) <参考にした書籍のコード抜粋> $file_dir = 'C:\Program Files\Apache Group\Apache2\htdocs\image\\'; $file_path = $file_dir . $_FILES["uploadfile"]["name"]; if (move_uploaded_file($_FILES["uploadfile"]["tmp_name"], $file_path)) { <参考にしたサイト> http://z49.org/2009/04/03/199/

    • ベストアンサー
    • PHP
  • PHPファイル・アップロードに関する質問

    あるPHP技術書籍で掲載のPHPファイル・アップロードの例を試したところ、アップロードするファイル・サイズは、小さいな(数KB)場合が成功、より大きな場合(例えば40KB~)が失敗!何故失敗なのかよく分かりません。ファイル種類には関係なさそうです。 詳しい方に教えて頂ければ助かります。 ※ ご参考 - 1. 具体的なHTML&PHPコードは、次の通りです。 2. 利用環境: 最新版XAMPP、Windows 7、XAMPPデフォルト・ルートをD:のある フォルダーに変更。D:に十分空き領域があると確認済み(数十GB)。 =====HTML===================== <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>fupload</title> </head> <body> <h3>ファイルアップロード</h3> <form method="POST" action="fupload.php" enctype="multipart/form-data"> <!-- MAX_FILE_SIZE は、必ず "file" input フィールドより前になければなりません --> <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> <!-- input 要素の名前が $_FILES 配列での名前となります --> <input name="userfile" type="file" size="70"/> <input type="submit" value="アップロード" /> </form> </body> </html> =====PHP--===================== <?php $uploaddir = './up/file/'; $uploadfile = basename($_FILES['userfile']['name']); echo '<pre>'; //if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir.$uploadfile)) { echo "ファイルアップロードに成功しました。\n"; } else { echo "ファイルアップロードは不成功です。\n"; } echo '<pre>'; ?> =====PHP関連設定(php.ini)========-== ;;;;;;;;;;;;;;;; ; File Uploads ; ;;;;;;;;;;;;;;;; ; Whether to allow HTTP file uploads. ; http://php.net/file-uploads file_uploads=On ; Temporary directory for HTTP uploaded files (will use system default if not ; specified). ; http://php.net/upload-tmp-dir upload_tmp_dir="C:\xampp\tmp" ; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize upload_max_filesize=2M ; Maximum number of files that can be uploaded via a single request max_file_uploads=20

    • ベストアンサー
    • PHP
  • ファイル名を変更してアップロードする方法

    お世話になります。 PHPでファイルをアップロードして管理するプログラムを作成していますが、日本語名がどうしても文字化けし、あまり日本語名を使わない方がいいという意見もあることから、どのようなファイル名でも指定できるようにして、保存するとき、プログラム側で、ファイル名を自動でYYYYMMDDHHII(例:200504160033.doc)みたいにしたいのですが、どこをいじったらよいのでしょうか。 (もし、日本語のファイル名が使えたとしても、同名のファイルだと、上書きされる問題もあるので。これだと、そういう問題もないと思います)何かアドバイスをいただけたらと思い、投稿しました。よろしくお願いいたします。 受け取る側のファイル.php $uploaddir = "./images/"; $uploadfile = $uploaddir. $_FILES['userfile']['name']; move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);

    • ベストアンサー
    • PHP
  • phpにてファイルをアップロード2

    先日質問させていただいたものなんですが、本やサイトを参考にして、以前とは違ったphpを使用してファイルをアップロードしようと考えています。 <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=Shift_JIS"> <title><?php echo basename($PHP_SELF);?></title> </head> <body> <p>ファイルアップロード</p> <form method="POST" action="gazou_upload.php" enctype="multipart/form-data"> <input type="file" name="uploadfile"> <input type="submit" value="送信"> </form> <?php if(isset($uploadfile)) { // アップロードされたファイルのサイズを確認 if($uploadfile_size <= 2097152) { // 移動 $moveto = "/public_html/img" . basename($uploadfile_name); move_uploaded_file($uploadfile, $moveto) or die("アップロード失敗\n"); print "<p>ファイルをアップロードしました。 - $moveto</p>"; } } ?> </body> </html> 上記を使おうと思っているのですが、これを使用した場合、 (1)上記をhtmlとしておくだけで、ファイルのアップが可能になるのか?phpも必要ですよね? (2)この場合アップされたファイルはドコに保存されるのか?…僕はpublic_htmlの中のimgというフォルダに移動して欲しいのですが。 皆様お手数ですが、教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • アップロードしたファイルの移動→表示

    ホームページ上でフォームからアップロードしたファイルを imageディレクトリ下に移動させて、 そのファイルを確認用にブラウザに表示させたいのですが 下記のプログラムではファイルの移動ができていないようで、 表示されず困っています。 $uploadfile = $_FILES['uploadfile']; move_uploaded_file($uploadfile, "image/$imagefile"); $body = "<IMG src='image/$imagefile' width='240' height='180'>"; 皆様どうかご指導お願いします。

    • ベストアンサー
    • PHP
  • 初心者ですみません。画像ファイルのアップロードについて

    任意の画像ファイルをHTMLフォームで入力して 登録確認画面に渡した後、ファイルをアップロード したいのですが上手くいきません。 ・フォーム入力ページ <FORM action="登録確認ページ.php" method="POST" enctype="multipart/form-data"> <INPUT type="file" name="uploadfile" size="50"> <INPUT type="submit" name="reg" value="OK"> ↓ ・登録確認ページ $uploadfile = $_FILES['uploadfile']; move_uploaded_file($uploadfile, "$PHOTOTMP$imagefile"); $body .= "<IMG src='$PHOTOTMP$imagefile' width='240' height='180'>"; として、登録確認ページでアップロードする 画像ファイルをいったん表示させてから 最終的にアップロードさせたいのですが 「×」マークが出て画像が表示されません。 データの受け渡しが上手くできていないのでしょうか。 どなたか教えて下さい。よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう