- 締切済み
ローカルからサーバーへのファイルアップロードについて
質問があります。 今ホームページを作成しています。 画像をあつかいたいのですが、FTPなどのソフトを使用せずにPHPで作成したWEB画面からローカルの画像を サーバーにアップロードしたいと考えています。 WEB画像はサーバー上にあり、 表示部分<INPUT>と参照ボタンとアップロードボタンが あります。 参照を押下すると自分の使用しているローカルのファイル・ディレクトリ情報があり、エクスプローラーバーが表示されてファイルを選択すると入力画面に 選択されてあファイル名が表示されるようにしました。 それでアップロードボタンを押すと、 WEB画面と同じサーバーの同じ場所に指定したファイルが アップロード(転送)される仕組みにしたいのですが、 どのようにすればいいでしょうか? アドバイスお願い致します。 【PHP:4.02】
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Marionette
- ベストアンサー率56% (42/74)
訂正というか、発言を一部撤回します。 >しかし、ドキュメントルート下に保存するのはあまり好ましくはないので、 >例えば「/var/httpd/data/upload」など非公開エリアにすることをお薦めします。 すみません。上の個所は無視してください。 前半部分をよく読んでいませんでした。アップロードした画像をそのまま表示させるのでは、やむおえないですね。 # ローカルという言葉の意味があやふやで判断に苦しむことが非常に多い。 # 正確にはクライアントでしょう? この場合は間違いとも言えないかも知れないけど。
- Marionette
- ベストアンサー率56% (42/74)
$UserFileにはテンポラリなファイル名なので使えません。 $UserFile_name:ファイル名(転送元ファイルのフルパス) $UserFile_size:ファイルサイズ $UserFile_type:ファイルタイプ(拡張子?) がセットされているので、これを利用してください。 また、basenameはWindowsクライアントからアップロードした場合は機能しないので、環境を選ばないようにするには explodeを使ってください。 但し、この件はPHP3で確認した内容なので、PHP4では可能になっているかも知れません。 以下、スクリプトサンプル。詳細はマニュアル参照のこと。 : : $UPLOAD_DIR = "/home/httpd/test" $UserFile_name = str_replace("\\\\", "/", $UserFile_name); // クライアントが Win, LinuxどちらでもOKなようにパス区切りを統一 $array = explode("/",$UserFile_name); $file = $array[count($array)-1]; if ($file != "") { if (!copy($UserFile, "$UPLOAD_DIR/$file")) { // または $UPLOAD_DIR."/".$file print ("failed to copy $file...<br>\n"); } } // ここから内容確認(実際に稼動させる場合は不要) $count = count($array); print "\$count=$count<br>"; print "\$UserFile=\"$UserFile\"<BR>"; print "\$UserFile_name=\"$UserFile_name\"<BR>"; print "\$file_name=\"$file_name\"<BR>"; print "\$UserFile_size=\"$UserFile_size\"<BR>"; print "\$UserFile_type=\"$UserFile_type\"<BR>"; // ここまで : : テンポラリファイルは自動的に削除されるので「unlink」は不要です。 それから、アップロードファイルを保存するディレクトリですが書き込み可能にする必要がありますがそうなっていますか。 しかし、ドキュメントルート下に保存するのはあまり好ましくはないので、例えば「/var/httpd/data/upload」など非公開エリアにすることをお薦めします。
- chie65536
- ベストアンサー率41% (2512/6032)
>copy($UserFile, "/home/httpd/test/."); (中略) >上記のように記述しました。 >その結果、 >Warning: Unable to create '/home/httpd/test/': No such file or directory >と表示されます。 >/home/httpd/testフォルダは実在するのですが、 >『作成できません』と表示されるのは PHPのファイルシステム関数の copy は、送り側も受け側も「ファイル名」が必要だと思いますが。 copy($UserFile, "/home/httpd/test/."); とやると、"/home/httpd/test/."を CreateFile しようとしてファイルシステムからエラーを返されると思います。 copy関数の呼び出しを以下のように変更してみて下さい。 copy($UserFile, "/home/httpd/test/".basename($UserFile)); ファイルシステム関数については、以下の参考URLの「ファイルシステム関数」を参照して下さい。
- chie65536
- ベストアンサー率41% (2512/6032)
WEBページのフォームタグを以下のようにします。 <form method="POST" action="CGIプログラム名" enctype="multipart/form-data"> こうすると「CGIプログラム名」で指定したCGIの標準入力に、 「最初の<INPUT>タグのヘッダ」 「空行」 「最初の<INPUT>タグのデータ」 「空行」 「2番目の<INPUT>タグのヘッダ」 「空行」 「2番目の<INPUT>タグのデータ」 と言う形式で入力内容が送られて来ます(どのようなデータ形式で送られて来るかは、サーバーにより異なるので、実際に試して内容を確認するしかありません) CGIでは、標準入力に送られて来た入力内容を「空行」で区切って、それぞれのタグのヘッダを調べ、それが画像を示すものであれば、引き続く「データ」部分を画像ファイルとして保存します。 実際に標準入力に送られて来るデータの内容が知りたければ、以下のようなCGIプログラムを置いて ----------------------------------- #/bin/csh echo "Content-Type: text/html" echo "" cat > ./inputdata echo "<HTML><BODY>受信データ保存!<BR></BODY><HTML>" ----------------------------------- フォームから実際にアップロードし、サーバーに保存された inputdata を見てみましょう(inputdata の中身を見る為に、それをサーバーからローカルに転送する場合はバイナリモードでFTPして下さい)
補足
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <?php if (empty($UserFile)) { # 変数が未定義の時にTRUE ?> <form method="post" action="file_up.php3" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" size="65536"> <input type="file" name="UserFile"> <input type="submit" value="アップロード"> </form> <?php } else { chmod($UserFile, 0777 ); copy($UserFile, "/home/httpd/test/."); if (is_uploaded_file($UserFile) ) { // HTTP POSTでアップロードされたファイルか? print "アップロードされました。<br>\n"; } else { print "<FONT COLOR=\"RED\">アップロードされませんでした。</FONT><br>\n"; } unlink($UserFile); // 一時ファイルの削除 } ?> </body> </html> ====================================== 上記のように記述しました。 その結果、 Warning: Unable to create '/home/httpd/test/': No such file or directory と表示されます。 /home/httpd/testフォルダは実在するのですが、 『作成できません』と表示されるのは そのフォルダがサーバーではなくローカルの ディレクトリをみているということですよね?