Symfoware

Symfowareについての考察blog

PHP ftp接続でディレクトリの存在チェック

phpでftp接続。
http://php.net/manual/ja/ref.ftp.php


接続後にsampleディレクトリを作成。
そこにindex.htmlをアップロードする処理を実装したいとします。


  1. <?php
  2. // ※エラー処理は行っていません
  3. // 接続と認証
  4. $ftp = ftp_connect('192.168.1.104', 21);
  5. ftp_login($ftp, 'testuser', 'password');
  6. // sampleディレクトリを作成
  7. ftp_mkdir($ftp, 'sample');
  8. // 作成したsampleディレクトリに移動
  9. ftp_chdir($ftp, 'sample');
  10. // ファイルをアップロード
  11. ftp_put($ftp, 'index.html', 'index.html', FTP_BINARY);
  12. // 接続を閉じる
  13. ftp_close($ftp);




これ、sampleディレクトリが存在しない場合は警告無しで終了するのですが、
sampleディレクトリを作った後実行すると警告が発生します。


# php sample.php
PHP Warning: ftp_mkdir(): Can't create directory: File exists in /var/dev/php/sample.php on line 8




ftp_mkdirの先頭に「@」をつけてエラー抑止でも良いのですが、
なんとか警告無しで処理を進められないものか。

ドキュメントを見てみると、「ftp_raw」という関数があります。
http://php.net/manual/ja/function.ftp-raw.php


これを使用して、FTPコマンドを直接実行してみたら警告は発生しないのでは。
FTPのコマンド一覧

ftp_rawを実行すると、ftpコマンドの実行結果の文字列が配列で帰ってきます。


  1. array (
  2. 0 => '250 OK. Current directory is /sample',
  3. )




「CWD sample」を実行して、sampleディレクトリへの移動を試してみる。
実行結果の1行めに「250 OK」が見つかれば、sampleディレクトリは存在し、移動まで完了。

「250 OK」がなければ、まだディレクトリは存在しないので、
sampleディレクトリを作成し移動。


  1. <?php
  2. // ※エラー処理は行っていません
  3. // 接続と認証
  4. $ftp = ftp_connect('192.168.1.104', 21);
  5. ftp_login($ftp, 'testuser', 'password');
  6. // rawコマンドで移動を試す
  7. $raw_result = ftp_raw($ftp, 'CWD sample');
  8. // 移動できなかったら
  9. if (strpos($raw_result[0], '250 OK') === false) {
  10.     // sampleディレクトリを作成
  11.     ftp_mkdir($ftp, 'sample');
  12.     // 作成したsampleディレクトリに移動
  13.     ftp_chdir($ftp, 'sample');
  14. }
  15. // ファイルをアップロード
  16. ftp_put($ftp, 'index.html', 'index.html', FTP_BINARY);
  17. // 接続を閉じる
  18. ftp_close($ftp);




100点の回答ではない気がしますが、これで警告なしに処理を続行することができました。


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/04/17(月) 22:23:34|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Ubuntu Server 16.04を仮想環境(KVM)にインストール | ホーム | Pure-FTPdの認証情報をMySQL(MariaDB)で管理する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1980-8588df15
この記事にトラックバックする(FC2ブログユーザー)