- ベストアンサー
phpでファイルをアップロードできるか?
- phpでのファイルアップロードについて質問します。
- eラーニング教材(htmlで作成)で、動画ファイルをストリーミングさせることになりました。
- FTPアップロードに失敗します。原因がわからなく、こまっています。ポートの指定が必要なのでしょうか?
- みんなの回答 (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で、ファイルのアップロードが許可されているどうかを確認するのが、最初かと。
その他の回答 (4)
- NARH
- ベストアンサー率82% (88/107)
<LOCAL のPC> -- HTTP POST --> <Web サーバ> -- FTP PUT --> <ストリーミングサーバ> で問題ないですか? ftp_put( $conn_id, $_FILES['img']['name'], $_FILES['img']['tmp_name'] ); として試してみましたけど、できますね。 当たり前ですが、ファイルの HTTP POST でのアップロードが成功していないとダメですね。 プログラムはHTTP POST でのファイルアップロードを処理する部分と、FTP PUT でアップロードする部分に分かれますから、それぞれのパートが成功していることをチェックする必要があると思います。
補足
ありがとうございます。 ><LOCAL のPC> -- HTTP POST --> <Web サーバ> -- FTP PUT --> ><ストリーミングサーバ>で問題ないですか? LOCAL のPCから直接<ストリーミングサーバ>へFTP PUTしたいと考えております。 ちなみに、ウェブサーバへHTTP POSTはできています。 確認したいのは、FTP PUTするときの、 ftp_put($conn_id, [アップロード先], [ローカルパス], FTP_BINARY) となるとおもうのですが、 [ローカルパス]の取得の仕方はどうすればいいのでしょうか? $_FILES['img']['name']でファイル名で渡すのはできないのでしょうか?
- hogehoge78
- ベストアンサー率80% (433/539)
少し、曖昧な点があったので教えていただきたいのですが、 ・ストリーミングサーバ、というのは、補足で記載されていた「チカッパ」のことですか? ・スクリプト中に書いてある「【ローカルのファイルパス】」というのは、どこのことを指していますか? もし、ローカルのファイルパスが、自分のPCのフルパスを指しているのでしたら、そもそも要件としては不可能なんですが、 チカッパにファイルをアップロードして、チカッパから別のストリーミングサーバにFTPでアップロード処理を行う ということなのでしょうか。
補足
ありがとうございます。 >・ストリーミングサーバ、というのは、補足で記載されていた「チカッパ」のことですか? ちがいます。 まずは、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)
> さっそくやってみましたが、結果は同じで、FTPには接続はするが、アップロードにはいたりません。 > > ほかに考えられる原因はありますでしょうか? 接続には成功しているそうなので、先程のコメントには記述しませんでしたが、 この手の実装をする場合は、まず疎通確認をします。 php を実行するサーバでftpコマンド等を利用して、ファイルが置けることを確認します。 環境の記載がないのですが、Windows であっても Linux, やその他Unix系OSであっても ftp クライアントぐらいは何か用意できると思います。 まずは、それを利用して接続元、先で問題ないことを確認します。 接続はできているとのことですからファイアーウォール等は大丈夫かもしれませんが、 接続元でも接続先でもパーミッション(権限)の問題なども出てきます。 接続先に書き込み権限も必要ですが、phpが誰の権限で動作しているかによって、 接続元のアップロード対象のファイルに辿りつけない場合などもあります。 まずは、そもそも ftp できるかどうかを判断してから、コードを書いてはどうでしょうか? 先ほどのパッシブ接続についても、環境によって必要のあるなしが変わります。 ftp コマンドなどで、アップロードできることを確認したら、そのときの手順をコーディングしていくだけですからね。
補足
丁寧なご回答ありがとうございます。 また十分な前提条件をお伝えしておらず申し訳ありません。 >そもそも ftp できるかどうかを判断してから、コードを書いてはどうでしょうか? サーバはレンタルサーバ(チカッパ)を利用しており、PHPプログラムを使わずFTPソフトをつかってのアップロードは問題なく可能です。 アップロードしているパーミッションは777で設定しています。 サーバの知識が乏しくこれくらいの情報しか提供できません。 なにかほかに試すことはありますか?
- NARH
- ベストアンサー率82% (88/107)
環境的な要素ですが $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); の後に ftp_pasv($conn_id, true); を入れてみてください。 一般的にFTPは 20, 21 と決められていますから、接続先で明示的に変えていなければデフォルトのポートで大丈夫だと思います。 ソースではポートが違っていたら、"FTP接続に失敗しました。"って出るはずのコードでしょ。
補足
ありがとうございます。 早速のお返事に感謝いたします。 さっそくやってみましたが、結果は同じで、FTPには接続はするが、アップロードにはいたりません。 ほかに考えられる原因はありますでしょうか?
お礼
丁寧なご回答ほんとにありがとうございました。 おかげさまでうごきました。 おっしゃるとおりです。 ローカルパスの指定の仕方で基本的に理解してませんでした。 いったんウェブサーバにmove_uploaded_file()でもっていき、 それをftp_putすると動きました。 あわせて、ストリーミングサーバ側にもやってみましたが動きました。 最後まで丁寧なご対応をいただき本当に感謝しております。 superside0様、NARH様、hogehoge78様、みなさまありがとうございました。