PHPでFTP送信する際には転送先パスの指定にご注意
仕事でどハマりしたのでメモメモ。
// 1.FTP接続 // 引数:IPアドレス, ポート番号, タイムアウト秒 $connId = ftp_connect('127.0.0.1', 21, 90); if (" $connId) { throw new Exception("FTP接続に失敗しました"); } // 2.FTPログイン // 引数:接続ID,FTPユーザーID,FTPユーザーパスワード $ret = ftp_login($connId, 'ftp_user', 'password'); if (!$ret) { throw new Exception("FTPログインに失敗しました"); } // 3.パッシブモードをONにする ftp_pasv($connId, true); // 4.ファイル転送を行う // 引数:接続ID,送信先パス(※),転送ファイルパス, 転送タイプ $ret2 = ftp_put($connId, 'ftp_cache', $file_path_from, FTP_BINARY); // 5.FTP接続の切断 // 引数:接続ID $ret3 = ftp_close($connId); if (!$ret2) { throw new Exception("ファイルのアップロードに失敗しました"); } if (!$ret3) { throw new Exception("FTP接続の切断に失敗しました"); }
今回オレがどハマりしたのが上記4のファイル転送。FTPログインをすると、そのユーザーのホームディレクトリにアクセスするんですが、ftp_put()で指定する転送先パスは、必ず相対パスを指定して下さい。絶対パスを指定すると「Could not create file.」というエラーを出力します。
例えば上記の場合、FTPユーザーが「ftp_user」だったら、「/home/ftp_user」とかがFTP接続時のホームディレクトリになるわけです。が、転送先を「/home/ftp_user/ftp_cache」とかを指定してしまうとアウト、実際には「/home/ftp_user/home/ftp_user/ftp_cache」に転送しようとしていることになります。ちゃんと「/home/ftp_user/ftp_cache」に転送したければ、相対パスで「ftp_cache」と指定しなくてはなりません。
ちなみに、この「Could not create file.」ってエラーがやっかいで、似たようなエラーで「553:Could not create file.」というのがあります。これはパーミッションエラーを指しており、chmod 777 とかでアクセス権限を与えてやると解決します。ところが今回オレが出会った事例はその方法では解決せず、ググってみても「権限エラーの疑いが……」とかしか出てこないので、エラく悩みました。実際には単に転送先をフルパスで指定していたから「そんなディレクトリ無えよ!」と怒られてただけだったわけです。分かってみれば実にくだらない……。