phpでファイルをアップロードできるか?

このQ&Aのポイント
  • phpでのファイルアップロードについて質問します。
  • eラーニング教材(htmlで作成)で、動画ファイルをストリーミングさせることになりました。
  • FTPアップロードに失敗します。原因がわからなく、こまっています。ポートの指定が必要なのでしょうか?
回答を見る
  • ベストアンサー

phpでファイルをアップロードできるか?

phpでのファイルアップロードについて質問します。 再質問となりますが、実際にコードを作成してやってみてうまくいかないので、 あらためて質問させていただきました。 eラーニング教材(htmlで作成)で、動画ファイルをストリーミングさせることになりました。 ウェブサーバ側へのアップロードする画面として、move_uploaded_file()やis_uploaded_file()メソッドをつかっていましたが、ストリーミングサーバ側としてFTP通信でポート20、21からのみのアップロードのみ許可されているとのことです。 ftp_put()メソッドを使ってアップロードさせたところうまくいきません。 **************<コード>************* $ftp_server="【サーバー名】"; $ftp_user_name="【アカウント名】"; $ftp_user_pass="【パスワード】"; $conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); if ((!$conn_id) || (!$login_result)) { echo "FTP接続に失敗しました。"; exit; } else { echo "FTP接続に成功しました。"; } ここまででFTPの接続はできているようです。 その直後に、 $local_file="【ローカルのファイルパス】"; $remote_file="【FTPサーバー上のアップロードファイルパス】"; if (!ftp_put($conn_id, $remote_file, $local_file, FTP_BINARY)) { echo "FTPアップロードに失敗しました。"; exit; } else { echo "FTPアップロードに成功しました。"; } **************<コード>************* FTPアップロードに失敗します。 原因がわからなく、こまっています。 ポートの指定が必要なのでしょうか? おしえてください。 よろしくおねがいたします。 **************** FTP supportはenabled になっています。 phpのバージョンは4または5です。 IE7以上のブラウザ環境を想定しています。

  • PHP
  • 回答数5
  • ありがとう数1

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

  • ベストアンサー
回答No.5

PHPは、ローカルPCで実行されているのではなく、Webサーバーで実行されているのですから、ftp_putの引数に、ローカルPCでのファイルパスを指定すること自体が間違えています。 (PHPでftp_putするということは、そのPHPが稼動しているWebサーバー内に存在するファイルを、別のftpサーバーに転送させることであって、PHPにアクセスしたブラウザ間とでftp通信できるすることではありません) #そんなことできたら、危なくてしょうがないですもんね。 ローカルPCのブラウザから<input type="file" name="img">で送信されたファイルが Webサーバー上では、$_FILES['img']['tmp_name']に存在するのですから、それを 別のftpサーバーにputするなら、指定するファイルは$_FILES['img']['tmp_name'] になります。 なお、アップロード完了後に一旦確認画面を出してからftp_put()するなど、2パスにしているなら $_FILES['img']['tmp_name']は1パス目の最後で消えてしまうので、move_uploaded_file()でも使って、 専用のディレクトリに移動させてから、そのmoveしたファイルをftp_put()することになります。 > この環境で動かしてから、実際のストリーミングで利用するサーバでためしてみようと考えております。 実際のストリーミングで利用するサーバが ブラウザからファイルのアップロードができないタイプのサーバーなので、一旦別のWebサーバにアップロードして、そこからftp_putを使うということなら、 <input type="file">を受けるこのPHPをそのまま、実際のストリーミングで利用するサーバーにもっていっても動きません。(アップロードできないのですから) なので、この場合、テスト中だけでなく、本番でも アップロードできるWebサーバーを別に立ててある必要があります。 逆に、実際のストリーミングで利用するサーバーでもこのPHPが動くのなら、 わざわざ、ftp_putしなくても、$_FILES['img']['tmp_name']をmove_uploaded_file() するだけで、完了です。 > FTP通信でポート20、21からのみのアップロードのみ許可されているとのことです。 まず、そのサーバーで、ftpの話じゃなくて、 httpで、ファイルのアップロードが許可されているどうかを確認するのが、最初かと。

hide_momiji
質問者

お礼

丁寧なご回答ほんとにありがとうございました。 おかげさまでうごきました。 おっしゃるとおりです。 ローカルパスの指定の仕方で基本的に理解してませんでした。 いったんウェブサーバにmove_uploaded_file()でもっていき、 それをftp_putすると動きました。 あわせて、ストリーミングサーバ側にもやってみましたが動きました。 最後まで丁寧なご対応をいただき本当に感謝しております。 superside0様、NARH様、hogehoge78様、みなさまありがとうございました。

その他の回答 (4)

  • NARH
  • ベストアンサー率82% (88/107)
回答No.4

<LOCAL のPC> -- HTTP POST --> <Web サーバ> -- FTP PUT --> <ストリーミングサーバ> で問題ないですか? ftp_put( $conn_id, $_FILES['img']['name'], $_FILES['img']['tmp_name'] ); として試してみましたけど、できますね。 当たり前ですが、ファイルの HTTP POST でのアップロードが成功していないとダメですね。 プログラムはHTTP POST でのファイルアップロードを処理する部分と、FTP PUT でアップロードする部分に分かれますから、それぞれのパートが成功していることをチェックする必要があると思います。

hide_momiji
質問者

補足

ありがとうございます。 ><LOCAL のPC> -- HTTP POST --> <Web サーバ> -- FTP PUT --> ><ストリーミングサーバ>で問題ないですか? LOCAL のPCから直接<ストリーミングサーバ>へFTP PUTしたいと考えております。 ちなみに、ウェブサーバへHTTP POSTはできています。 確認したいのは、FTP PUTするときの、 ftp_put($conn_id, [アップロード先], [ローカルパス], FTP_BINARY) となるとおもうのですが、 [ローカルパス]の取得の仕方はどうすればいいのでしょうか? $_FILES['img']['name']でファイル名で渡すのはできないのでしょうか?

回答No.3

少し、曖昧な点があったので教えていただきたいのですが、 ・ストリーミングサーバ、というのは、補足で記載されていた「チカッパ」のことですか? ・スクリプト中に書いてある「【ローカルのファイルパス】」というのは、どこのことを指していますか? もし、ローカルのファイルパスが、自分のPCのフルパスを指しているのでしたら、そもそも要件としては不可能なんですが、 チカッパにファイルをアップロードして、チカッパから別のストリーミングサーバにFTPでアップロード処理を行う ということなのでしょうか。

hide_momiji
質問者

補足

ありがとうございます。 >・ストリーミングサーバ、というのは、補足で記載されていた「チカッパ」のことですか? ちがいます。 まずは、ftp_put()を動かさないと話がはじまらないので、現在つかっているチカッパのサーバ環境でfile_put()を動かそう、ということです。 この環境で動かしてから、実際のストリーミングで利用するサーバでためしてみようと考えております。 >・スクリプト中に書いてある「【ローカルのファイルパス】」というのは、どこのことを指していますか? file_put()の第3引数に設定するパスになります。 ここには、ローカルPC内のファイルを指定して、第2引数で指定しているサーバパスにアップロードしようとしています。 >もし、ローカルのファイルパスが、自分のPCのフルパスを指しているのでしたら、そもそも要件としては不可能なんですが、チカッパにファイルをアップロードして、チカッパから別のストリーミングサーバにFTPでアップロード処理を行う 参照ボタンでローカルPCからファイルを選択させてパスを取得して、file_put()の第3引数にいれようとおもっていたのですが、難しいでしょうか? is_uploaded_file( $_FILES['img']['tmp_name'] ) move_uploaded_file( $_FILES['img']['tmp_name'], $updir.$_FILES['img']['name'] ) ) こんな感じでできたら・・とおもっていたもので。 やはりむつかしいでしょうか。

  • NARH
  • ベストアンサー率82% (88/107)
回答No.2

> さっそくやってみましたが、結果は同じで、FTPには接続はするが、アップロードにはいたりません。 > > ほかに考えられる原因はありますでしょうか? 接続には成功しているそうなので、先程のコメントには記述しませんでしたが、 この手の実装をする場合は、まず疎通確認をします。 php を実行するサーバでftpコマンド等を利用して、ファイルが置けることを確認します。 環境の記載がないのですが、Windows であっても Linux, やその他Unix系OSであっても ftp クライアントぐらいは何か用意できると思います。 まずは、それを利用して接続元、先で問題ないことを確認します。 接続はできているとのことですからファイアーウォール等は大丈夫かもしれませんが、 接続元でも接続先でもパーミッション(権限)の問題なども出てきます。 接続先に書き込み権限も必要ですが、phpが誰の権限で動作しているかによって、 接続元のアップロード対象のファイルに辿りつけない場合などもあります。 まずは、そもそも ftp できるかどうかを判断してから、コードを書いてはどうでしょうか? 先ほどのパッシブ接続についても、環境によって必要のあるなしが変わります。 ftp コマンドなどで、アップロードできることを確認したら、そのときの手順をコーディングしていくだけですからね。

hide_momiji
質問者

補足

丁寧なご回答ありがとうございます。 また十分な前提条件をお伝えしておらず申し訳ありません。 >そもそも ftp できるかどうかを判断してから、コードを書いてはどうでしょうか? サーバはレンタルサーバ(チカッパ)を利用しており、PHPプログラムを使わずFTPソフトをつかってのアップロードは問題なく可能です。 アップロードしているパーミッションは777で設定しています。 サーバの知識が乏しくこれくらいの情報しか提供できません。 なにかほかに試すことはありますか?

  • NARH
  • ベストアンサー率82% (88/107)
回答No.1

環境的な要素ですが $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); の後に ftp_pasv($conn_id, true); を入れてみてください。 一般的にFTPは 20, 21 と決められていますから、接続先で明示的に変えていなければデフォルトのポートで大丈夫だと思います。 ソースではポートが違っていたら、"FTP接続に失敗しました。"って出るはずのコードでしょ。

hide_momiji
質問者

補足

ありがとうございます。 早速のお返事に感謝いたします。 さっそくやってみましたが、結果は同じで、FTPには接続はするが、アップロードにはいたりません。 ほかに考えられる原因はありますでしょうか?

関連するQ&A

  • phpのftp_putについて

    はじめましてphp初心者です。 以下の内容を実行した際に うまく行かず困っています。 $ftp_server="【サーバー名】"; $ftp_user_name="【アカウント名】"; $ftp_user_pass="【パスワード】"; //サーバーに接続する $conn_id = ftp_connect($ftp_server); // ユーザ名とパスワードでログインする $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // 接続できたか確認する if ((!$conn_id) || (!$login_result)) { echo "FTP接続に失敗しました。"; exit; } else { echo "FTP接続に成功しました。"; } $local_file="【ローカルのファイルパス】"; $remote_file="【FTPサーバー上のアップロードファイルパス】"; if (!ftp_put($conn_id, $remote_file, $local_file, FTP_ASCII)) { echo "FTPアップロードに失敗しました。"; exit; } else { echo "FTPアップロードに成功しました。"; } ftp_close($conn_id); ローカル、リモート共にファイルの位置は間違っていません。 また以上のように反映させた際に返ってくる答えは 「FTP接続に成功しました。」 「FTPアップロードに成功しました。」 と出てきます。 しかし、ffftpを確認したところ サバー側に変化がありません。 手動ではffftpでアップ可能です。 ご教授お願い致します。

    • 締切済み
    • PHP
  • CGI版PHPでのFTPの使用について

    現在、RedhatLinux6.2J,PostgreSQL7.1,php-4.0.4-pl1という環境でCGI版PHPを使用しています。 ftp()を使用しているのですがなかなかうまくいかず困っています。 現在下記の様なソースをPHPマニュアルからもってきて動かしています。 ==================================================================== #! /usr/local/bin/php -q <? $ftp_server = "ftpサーバーのIP"; $user = "username"; $pass = "passwd"; $conn_id = ftp_connect("$ftp_server"); $login_result = ftp_login($conn_id, $user, $pass); if ((!$conn_id) || (!$login_result)) { echo "Ftp connection has failed!"; echo "Attempted to connect to ".$ftp_server." for user ".$user; die; } else { echo "Connected to ".$ftp_server.", for user ".$user; } $local_file = "test.txt"; $remote_file = "up.txt"; $upload = ftp_put($conn_id, $remote_file, $local_file, FTP_ASCII); if (!$upload) { echo "Ftp upload has failed!"; } else { echo "Uploaded ".$local_file." to ".$ftp_server." as ".$remote_file; } ftp_quit($conn_id); ?> ==================================================================== $conn_id = ftp_connect("$ftp_server");のところで Fatal error:Call to undefined function: ftp_connect() in ./ftp_test.php on line 7 というエラーがでてしまい落ちてしまいます。 何かお分かりになる方おられましたらご教授願えますでしょうか? インストール時にしなければいけないことや php.iniファイル等で設定しなければいけない項目等ありましたらご教授お願いします。 また、passiveモードでの送受信の仕方についてもぜひご教授お願いいたします。 失礼します。

    • ベストアンサー
    • PHP
  • phpでファイルをアップロードできるか?

    phpでのファイルアップロードについて質問します。 eラーニング教材(htmlで作成)で、動画ファイルをストリーミングさせることになりました。 ウェブサーバ側へのアップロードする画面として、move_uploaded_file()やis_uploaded_file()メソッドをつかっていましたが、ストリーミングサーバ側としてFTP通信でポート20、21からのみのアップロードのみ許可されているとのことです。 ftp_put()メソッドがあるようですが、このメソッドでいいのでしょうか? またこのメソッドでポートの指定はできるのでしょうか。 サーバの知識が弱いもので、まとはずれな質問でしたらごめんなさい。 phpのバージョンは4または5です。 IE7以上のブラウザ環境を想定しています。

    • ベストアンサー
    • PHP
  • ftp_getでローカルにファイルが見当たらない

    下記のようなスクリプトでFTPダウンロードを試みています。 ダウンロード元はホスティング会社のサーバで、 ダウンロード先は私のWindowsPCになります。 接続から読み込みまで万事うまく行き、エラー表示もなく、 Successfully written to C:\test\backup.zip というメッセージが表示されるところまでいくのですが、 C:\test\を開けてみると肝心のファイルが見当たりません。 サーバやPCの設定等もあるかもしれませんが、 どのような原因が考えられますでしょうか? よろしくお願いいたします。 <スクリプト> $local_file = "C:\\test\\backup.zip"; $server_file = "/tmp/backup.zip"; $conn_id = ftp_connect($ftpserver); $login_result = ftp_login($conn_id, $usr, $pass); ftp_pasv($conn_id, true); if(ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)){ echo "Successfully written to {$local_file}"; } else { echo "There was a problem"; } ftp_close($conn_id);

    • ベストアンサー
    • PHP
  • PHP ftp_fput()関数について

    下記のPHPスクリプトで、JPEGファイルをFTPサーバーにアップしようとしてるんですが、 サーバー側でエラーが出ます。どこが間違っているのか指摘していただけますか? ※ftp_chdir($ftp, $path); の$path は、相対パスか絶対パスか、URLか ※ftp_fput($ftp, $remote_file, $fp, FTP_BINARY)の、第二引数$remoto_file は、リモートでの ファイル名だけでよいのか、相対パスか、絶対パスかURLか ※ちなみに、FTPサーバーへのログインはできてます。 <?php //$photo = "akashi.jpg"; $photo = $_GET['photo']; // FTPサーバーに接続 $ftp_server="users109.lolipop.jp"; $ftp = ftp_connect($ftp_server); //$res = ftp_login($ftp, "root", " "); $res = ftp_login($ftp, " ", " "); if($res==FALSE){ echo("FTPサーバーのログインに失敗しました。"); exit(1); } //$path = "/home/users/1/raindrop.jp-5247423/web/tsukushinbo/upload_photo"; // 絶対パス $path = "../tsukushinbo/upload_photo"; // 相対パス ftp_chdir($ftp, $path); // サーバー側のディレクトリを変更 /* $cur = ftp_pwd($ftp); echo($cur); exit(1); */ // ローカル側でファイルをオープン /* $dir = dirname($photo); // ファイルあるいはディレクトリへのパスを含む文字列を受け取って、 親ディレクトリのパスを返します。 //$filename = $dir."/".$photo; echo($filename); exit(1); */ $fp = fopen("$photo", 'rb') or die; //$fp = fopen("$filename", 'r') or die; // ローカルでオープンされているファイルのポインタ。 ファイルの終端まで進むと読み込みが終了する。 // FTPサーバーに画像ファイルをアップロード $remote_file = $photo; // リモート上でのファイル名指定 if(ftp_fput($ftp, $remote_file, $fp, FTP_BINARY)){ // ローカルでオープンしている画像ファイルをバイナリモードでFTPサーバーにアップロードする echo "Successfully uploaded $file\n"; }else{ echo "There was a problem while uploading $file\n"; } fclose($fp); ftp_close($ftp); //header("Location: bbs.php"); ?>

    • ベストアンサー
    • PHP
  • PHPでftpを行うと速度ダウン

    PHPを使ってftp処理をしています。例えば、下記の通りのプログラムを作ったとします。 ---(※エラー処理を削除しています)--- <?php // 接続を確立する $conn_id = ftp_connect($ftp_server); // ユーザ名とパスワードでログインする $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // ファイルをアップロードする $upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY); // FTP ストリームを閉じる ftp_close($conn_id); ?> ---------------------------------- 問題なく、ftp処理はできるのですが、MS-DOSプロンプトからftpした場合やffftpなどのソフトを使ってftpした場合と比べて格段に速度が落ちます。 具体的に言えば、サーバ側・クライアント側も光回線を使っていた場合に MS-DOSプロンプト:80Mbpsくらい PHPによるftp:10Mbpsくらい の速度に落ちます。実行速度はMRTGを使ってみています。 PHPの仕様上、どうしようもないものなのでしょうか。 もしくは速度アップの関数などあるのでしょうか。 ご存知の方、ご教授ください。

    • 締切済み
    • PHP
  • 画像アップロード型掲示板でのファイル選択ダイアログ

    画像アップロード型の掲示板において、ファイル選択ダイアログでファイル選択したら、 FTPサーバーにアップし、かつ、アップしたユーザー自身が、ブラウザでその画像を見れるという仕様にしたいんですが、FTPサーバー側に選択した画像ファイルが、アップされてないのです。 アップした画像をローカルのブラウザのページで見ると、x印のアイコンだけが表示されていて、中身の画像ファイルが表示されてないのです。ですが、そのx印のアイコンを右クリックすると、画像のピクセル数や、FTPサーバー先の絶対パスがちゃんと表示されてるんです。 下記のようなファイル選択ダイアログが表示されるHTMLと、そこから呼び出すPHPスクリプト において、どこか間違っているのか教えていただきたいです。よろしくお願いします。 <html> <head><title>ファイル選択ダイアログ</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <form name="form1" method="POST" enctype="multipart/form-data" action="file_upload.php"> <input type="file" name="result"> <input type="submit" name="upload" value="添付画像"> </form> </body> </html> --------------------------------------------------------------------- <?php $photo = $_POST['photo']; //////////////////////////////////// // ローカル側でファイルをオープン // //////////////////////////////////// $filename = "./files/$photo"; // $parent(親ディレクトリの直下のファイルだから、何もつけなくてよい) echo("filename=".$filename); // デバッグ用 $fp=fopen($filename, 'rb') or die; /* ファイルオープンダイアログで選択したファイルのファイル名はbbs.phpと同じディレクトリにあるfile_uproad.php から見ると、$photoにつけるパスは不要 */ /////////////////////////////////////////////////////////////////////// // FTPサーバーに接続、ログイン、サーバー側のカレントディレクトリ変更 // /////////////////////////////////////////////////////////////////////// $ftp_server="users109.lolipop.jp"; $ftp = ftp_connect($ftp_server); $res = ftp_login($ftp, "~", "~"; if($res==FALSE){ echo("FTPサーバーのログインに失敗しました。"); exit(1); } $cur = ftp_pwd($ftp); // サーバーにログイン直後のサーバー側のカレントディレクトリ echo("cur=".$cur); exit(1); ftp_chdir($ftp, $cur); // サーバー側のディレクトリを変更 ///////////////////////////////////////////// // FTPサーバーに画像ファイルをアップロード // ///////////////////////////////////////////// $remote_file = $photo; // リモート上でのファイル名指定 echo($remote_file); //if(ftp_fput($ftp, $remote_file, $fp, FTP_BINARY)){ // ローカルでオープンしている画像ファイルをバイナリモードでFTPサーバーにアップロードする if(ftp_fput($ftp, $remote_file, $fp, FTP_BINARY)){ // リモートのカレントディレクトリにアップされる echo "Successfully uploaded $file\n"; }else{ echo "There was a problem while uploading $file\n"; } //////////// // 後処理 // //////////// fclose($fp); ftp_close($ftp); //header("Location: bbs.php"); ?>

    • 締切済み
    • PHP
  • phpでftpのアップロードができないのですが・・・

    phpでftpコマンドを使ったアップロードができません。どこが間違っているのでしょうか。 ftpで接続してログインするところまでは間違いなくできているのですが・・・よろしくお願いします。 file.php のフォーム部分 <form enctype="multipart/form-data" action="fileupload.php" method="post"> <input type="FILE" name="File"><br>     <input type="SUBMIT" value="送信">     <input type="RESET" vaiue="取消">     </form> fileupload.php のアップロード処理部分 //アップロード後のファイルの名前を仮にaaa.txtとする $file2 = "/public_html/aaa.txt"; if(isset($_REQUEST["File"])){ $file=$_REQUEST["File"]; } $ftp = ftp_connect($hostname) or die("接続失敗"); ftp_login($ftp,$user,$pass) or die("ログイン失敗"); ftp_put($ftp, $file2 , $file , FTP_ASCII) or die("アップロード失敗");

    • ベストアンサー
    • PHP
  • FTP サーバーにある画像を表示するには

    $lines = file('ftp://USER:PASS@ftp.example.com/data.txt'); FTP サーバーのテキストファイルにアクセスするには上記のように出来ますが、 サーバーにある画像を表示することは出来るのでしょうか? ↓ こんな感じで表示出来たら便利だと思ったのですが... echo "<img src=" . file('ftp://USER:PASS@ftp.example.com/image.jpg') . " />"; とりあえず今は一度保存して表示するようにしてますが、 なにかアドバイスあれば よろしくお願いします。 $conn_id = ftp_connect($ftp_server); ftp_login($conn_id, $user, $pass); ftp_get($conn_id, $url, $url, FTP_BINARY); FTP 関数一覧 http://us2.php.net/manual/ja/book.ftp.php

    • ベストアンサー
    • PHP
  • ファイルのアップロードに関して

    phpでファイルのアップロードをするプログラムを作成しています。 当初 move_uploaded_file を使い意外と簡単に作れたのですが、ファイルの所有者がApacheになってしまいます。 何故、ファイルの所有者が Apache でまずいのかというと、ユーザーの使用域を quota で制限しているのですが、所有者がApacheになっていると、制限ができません。 (ユーザーのエリアにアップロードしても、ユーザーが Apache になっていると、使用済み容量が増えません。) そこで、アップロード後 chown で所有者を変更しようと思いましたが、ルート権限でないと変更できないようで、うまく行きませんでした。 マニュアルを見ていると ftp_connect で接続し ftp_login でログインしてから ftp_put で転送してやれば所有者をログイン時のユーザーにできそうと思い作成したのですが、 <FORM method="post" action="hoge.php" enctype="multipart/form-data"> : : <input name="userfile" size="60" type="file"> では、hoge.phpに転送元のファイル名がうまく引き渡されません。 よい知恵はないでしょうか。 尚、サーバー側の環境は Fedora 1 Apache/2.0.48 PHP Version 4.3.4 です。 よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう