- PR -

commons.net.ftp.FTPClientで95文字以上のファイルが送信できない。

1
投稿者投稿内容
PAL
ベテラン
会議室デビュー日: 2002/11/14
投稿数: 63
投稿日時: 2005-11-08 18:09
commons.net.ftp.FTPClientで95文字以上のファイルが送信出来ません。
ソースは、
コード:
FileInputStream _fis = new FileInputStream(localFilePath);
_ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
_ftpClient.storeFile(newFileName, _fis);
if (!FTPReply.isPositiveCompletion(_ftpClient.getReplyCode())) {
	log.error("The FTP error occurred.");
	log.error("FTP REPLY CODE :" + _ftpClient.getReplyString());
	throw new Exception();
}


とした場合、newFileNameが95文字を超えると、
ERROR:[main] The FTP error occurred.
ERROR:[main] FTP REPLY CODE :550 **ここはファイル名**: The system cannot find the path specified.

となってしまいます。
Windowsのコマンド上でのFTP,FFFTPで確認しましたが、正常にファイル名は変更できています。
また、
代替案1:短いファイル名で転送してリネーム作戦は、
_ftpClient.storeFile("test", _fis);
_ftpClient.rename("test",newFileName);
とした所で同様のエラーが発生しました。
代替案2:sendCommandしてやる!作戦は、
_ftpClient.storeFile("test", _fis);
_ftpClient.sendCommand("RNFR test");
_ftpClient.sendCommand("RNTO "+ newFileName);
とした所で同様のエラーが発生しました。

これは、FTPClientの仕様なのでしょうか?
よろしくお願いします。
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2005-11-08 18:33
commonsのFTPClientは使ったことがないので直接的な回答ではありませんが、

1.実際にサーバに送信しているパケットをキャプチャして他のFTPクライアントからのものと比較してみる。

2.該当の処理のソースコードを確認してみる。
せっかくオープンソースのプロダクトなのでソースを見てみない手はないと思いますよ。
PAL
ベテラン
会議室デビュー日: 2002/11/14
投稿数: 63
投稿日時: 2005-11-09 11:10
引用:

mogeさんの書き込み (2005-11-08 18:33) より:
1.実際にサーバに送信しているパケットをキャプチャして他のFTPクライアントからのものと比較してみる。


をやってみました。
キャプチャーはetherealを使いました。(面白いですね^^)
で、実際にFFFTPとJavaでのテスト環境に微妙な違い(親フォルダーが違う)があったため、その部分をあわせてテストした所、Javaで失敗するパターン場合は、FFFTPでも失敗する事がわかりました。

で、その条件は
STORするファイルのフルパスが250桁以上の場合エラー
でした。

ここは、憶測ですが多分「FTPのコマンドの総桁数が255桁以上の場合エラー」が正しいのかなと思っていますが、そこまで追試していません。

また、FFFTPはSTORする場合に対象ファイルのフルパスを必ず設定しますが、
(ex: STOR /a/b/c/d/e/f/file.txt)
Javaの場合は、CWDした後で、ファイル名だけでSTOR可能ですが
(ex: CWD /a/b/c/d/e/f/ の後、STOR file.txt)
その場合でも同様のエラーで終了してしまいます。

エラーメッセージも、
550 **ここはファイル名**: The system cannot find the path specified.
であるので、「FTPサーバー内部で、STORの際にフルパスにしていて、それが制限値を超えるとエラー」となるのだろう、と推察しています。

一応、エラーの発生する条件がcommonsのFTPClientにはない事がわかったので、ここで調査を打ち切ろうと思いますが、もし

・そりゃ観点が違うよ!
とか、
・その制限値の解除方法知ってる、
という方がいらしたらお教えください。

以上です。



[ メッセージ編集済み 編集者: PAL 編集日時 2005-11-09 11:14 ]
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2005-11-09 19:05
FTPのデーモンとかファイルシステム(OS)は何をお使いでしょうか?

興味があったので、同じことを次の条件で試してみました。

ftpd = proftpd-1.2.10
fs = ext3 (linux)

結果は、
「STORするファイルのフルパスが250桁以上の場合でも正常」
でした。

251という数字、ファイルシステムの制限のような印象です。
windowsをサーバにお使いでしょうか?
tarnwo
ベテラン
会議室デビュー日: 2002/10/25
投稿数: 58
投稿日時: 2005-11-09 21:28
引用:

PALさんの書き込み (2005-11-09 11:10) より:
で、その条件は
STORするファイルのフルパスが250桁以上の場合エラー
でした。



話題が逸れてしまいますが、
File f = new File(fileaName);
f.createNewFile();
で、fileNameに設定するファイル名(例 c:\temp\XX.txt のXX.txt)の
長さが251(かな?)を超えるとファイルが作成されませんね。(WIN XP)

[ メッセージ編集済み 編集者: tarnwo 編集日時 2005-11-09 21:29 ]
PAL
ベテラン
会議室デビュー日: 2002/11/14
投稿数: 63
投稿日時: 2005-11-10 08:53
引用:

Java僧さんの書き込み (2005-11-09 19:05) より:
FTPのデーモンとかファイルシステム(OS)は何をお使いでしょうか?
興味があったので、同じことを次の条件で試してみました。
ftpd = proftpd-1.2.10
fs = ext3 (linux)
結果は、
「STORするファイルのフルパスが250桁以上の場合でも正常」
でした。
251という数字、ファイルシステムの制限のような印象です。
windowsをサーバにお使いでしょうか?


WindowsXP(or Windows 2003) + IISでのFTP環境です。
確かにOSの制限でした。
Windowsだとファイルも作れませんね。

そういえば、JavaのプログラムでFTPを使ってファイルを転送しているのですが、
取得元のサーバーは、RedHatEnterprise3 + vsftpd を使用しているのですが、
普通に長めのファイルを取得できていました。
最初の方に上記確認していたのですが、調査の過程でコロッ忘れていました。

まぁ、今回はOSの制限ということで、運用や途中のプログラムにブロックをつけて
対応しました。

ご指摘ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)