- ベストアンサー
サーバカレント配下サブフォルダ内にファイルをアップさせたいのですが…
ブラウザからローカルのファイルを指定して、実行ボタンを押すとサーバに、指定したファイルがアップされるプログラムを作成中です。 『copy($file, $file_name);』で、サーバにアップされるところまでは出来たのですが、このソース(.php)が存在するカレントに、ファイルがアップされてしまいます。 カレント配下に作成してあるサブフォルダ内にアップさせるには、どうすれば良いでしょうか? (もしくは、カレントにアップされたファイルを配下サブフォルダに移動でも良いですが) <以下PHPソースの抜粋> ~~~~~~~~~~~8<~~~~~~~~~~~~8<~~~~~~~~~~~ <TD nowrap><FONT size="-1">ファイル file</FONT></TD> <TD nowrap> <INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" SIZE="65536"> <INPUT TYPE="file" NAME="file" SIZE="42"> </TD> ~~~~~~~~~~~8<~~~~~~~~~~~~8<~~~~~~~~~~~ <TD nowrap><INPUT id=submit1 NAME=submit1 type=submit value=" 実 行 "></TD> ~~~~~~~~~~~8<~~~~~~~~~~~~8<~~~~~~~~~~~ if ($file_name != '' && $file_size != 0) { copy($file, $file_name); } ~~~~~~~~~~~8<~~~~~~~~~~~~8<~~~~~~~~~~~
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 すごい単純な事なのでおそらく、チェックはしているとは思いますが、一応・・・。 新しいファイルの名前、ここでは「 $file_name 」ですがちゃんと保存させたいパスは通っていますよね・・・? $file_name = "./temp/xxxx.txt"; こんな感じになると思いますが。 php.ini の設定としては(/etc/php.ini) file_uploads On ;ファイルをアップロード可能に upload_tmp_dir /tmp ;一般的なアップロード先 upload_max_filesize 8M ;どのくらいの大きさまで こんな感じでしょうか。
その他の回答 (2)
- re13b
- ベストアンサー率58% (18/31)
> 『move_uploaded_file()』って、サーバにすでにアップされているファイルを移動するときに用いるのだと思いますが そうです。アップロードされたファイルを移動するためのものです。 アップする場所は、『カレント』又は『カレント下のサブフォルダ』とのことですが、こ れは、この場所しかダメということなのでしょうか? もし、アップロードする場所はどこでもよくて、それを加工する際に指定したフォルダへ移動する ということであれば、『move_uploaded_file()』で良いと思ったのですが・・・ この場合にアップロードされる場所は、環境設定の upload_tmp_dir に記載されたパスになります。 それと、私の書いたコードは、$_FILES を参照できる環境になっていないと、動作しないと思います。 また、環境設定で file_uploads を有効にしておく必要があります。 copy でうまくコピーされない、とのことですが、これは copy を実行した結果が False になっている ということでしょうか?
補足
わかりにく説明になってすいません。 少し詳しく補足させていただきます。 まず、PHPファイルは“http://localhost/test/pppp.php”にあります。 if ($file_name != '' && $file_size != 0) { copy($file, $file_name); } で実行すると、“http://localhost/test/xxxx.txt”という具合に“xxxx.txt”ファイルはアップされます。 で、、、実際にアップしたい場所はというと “http://localhost/test/temp/xxxx.txt”です。 一度、“http://localhost/test/xxxx.txt”にアップされたものを、 “http://localhost/test/temp/xxxx.txt”に移動する形でOKです。 ANo.1[補足]で私が書いたソースで実行したところ、 “http://localhost/test/xxxx.txt”にアップされたと同時に “http://localhost/test/0”という、同じファイルサイズのファイルが出来ました。 当方の『move_uploaded_file()』の使い方が悪かったんだと思いますが、環境設定の方法がイマイチ良くわかっていません。 よって、“upload_tmp_dir”や“$_FILES”を用いずに行いました。 また、「file_uploads を有効にする」とありますが、これら環境設定は、PHPがインストールされているどこかの環境ファイル(.iniや.cnfnなど?)を編集する必要があるのでしょうか? すいません・・・PHPを始めたばかりの初心者なもので。 m(_"_)m
- re13b
- ベストアンサー率58% (18/31)
手元に転がっていた奴で、サーバー上では試していないコードですが・・・ これで、アップロード&指定したファイルを操作、というところまでいけると思うのですが。 php ver 4.0.3 以前だとこのコードではダメです。 copy() で操作するよりも move_uploaded_file() のほうが楽っぽいので、もっぱらこっちを使ってます。 <?php $path = "/tmp/temp.ttt"; // サーバー内一時保存ファイル名 if ( !empty( $_FILES[ 'uploaded' ][ 'name' ] )) { if ( move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $path ) == FALSE ) { printf( "ファイルのアップロードに失敗しました:%s<br>\n", $_FILES[ 'uploaded' ][ 'error' ] ); } else { printf( "ファイルのアップロードが完了しました<br>\n" ); } } else { echo <<<EOD <form enctype="multipart/form-data" action="{$_SERVER[ 'PHP_SELF' ]}" method=post> <input type=hidden name=MAX_FILE_SIZE value=10000000> 送信ファイル名 <input type=uploaded type=file size=30> <input type=submit value="アップロード"> </form> EOD; } ?>
補足
『move_uploaded_file()』関数の存在は知っていたのですが、いまいち使用方法がわからず、うまくいきませんでした。 『move_uploaded_file()』って、サーバにすでにアップされているファイルを移動するときに用いるのだと思いますが、 $path = "/temp/"; ~~~~~~~~~~~8<~~~~~~~~~~~~8<~~~~~~~~~~~ if ($file_name != '' && $file_size != 0) copy($file, $file_name); move_uploaded_file($file, $path+$file_name); } 上のように記述して使ってみましたが、移動しませんでした。
お礼
失礼しました。自己解決しました。 $path = "./temp/"; ~~~~~~~~~~~8<~~~~~~~~~~~~8<~~~~~~~~~~~ if ($file_name != '' && $file_size != 0) { // copy($file, $file_name); move_uploaded_file($file, $path . $file_name); } とすることで、上手くいきました。 “$path + $file_name”ではなく、 “$path . $file_name”としなければいけなかったんですね。 他の言語のクセがあって、“+”を用いてしまいましたが、PHPでは“.”でつなぐんですね。 すいませんでした。 どうも、ありがとうございました。
補足
if ($file_name != '' && $file_size != 0) { // copy($file, $file_name); move_uploaded_file($file, "./temp/ppp.pdf"); } という具合に、move_uploaded_fileにパスとファイル名を直接指定すると、上手く移動(実際は移動ではなくコピー元のファイルが残るので、コピー?)されました。 よって、$file_nameの中身が変だったようです。 ちなみに、下のようにして実行したのですが、やはり、“http://localhost/test/”に“0”というファイルが出来るだけです。 “$file_name”の中身がからっぽなのでしょうか? マズいところがありましたら、ご指摘いただけると助かります。 $path = "./temp/"; ~~~~~~~~~~~8<~~~~~~~~~~~~8<~~~~~~~~~~~ if ($file_name != '' && $file_size != 0) { // copy($file, $file_name); move_uploaded_file($file, $path+$file_name); } ちなみに・・・・ php.iniを確認したところ、file_uploads On、他、きちんと設定されておりましたが、$_FILESの設定されている箇所はありませんでした。 尚、当方のPHPヴァージョンですが、phpinfo()の “PHP Variables”欄の“_SERVER["SERVER_SOFTWARE"]”に 『Apache/2.0.53 (Win32) mod_ssl/2.0.53 OpenSSL/0.9.7e PHP/4.3.10』と表示されていました。 よって、PHPヴァージョンは4.3.10だと思います。