私は非常に単純なファイルのアップロードをしようとしています。 Java任意のファイルをアップロードできるFTPClient。/Oエラー。
私は次のクラスを使用しています:
import org.Apache.commons.net.ftp.FTPClient;
....
FTPClient client = new FTPClient();
FileInputStream fis = null;
try {
client.connect("mydomain.com");
client.login("user", "password");
String filename = "myPDF.pdf";
fis = new FileInputStream(filename);
client.storeFile("temp.pdf", fis);
fis.close();
client.logout();
} catch (IOException e) {
e.printStackTrace();
}
なぜこれが機能しないのですか、どうすれば修正できますか?
FTPClient のデフォルトの転送モードはFTP.ASCII_FILE_TYPE
。バイナリモードで転送するには、構成を更新するだけです。
これをファイルに追加します
ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE);
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);
私はxlsxファイルでも同じ問題を抱えていましたが、これは良い解決策でした。
FTPには、テキストファイル用とバイナリ(イメージ)ファイル用の2つの操作モードがあることを忘れがちです。コマンドラインftpクライアントから接続する古き良き時代では、ファイルを要求する前に転送モードを設定することを慎重に覚えていました。今日、多くの状況がデフォルトでバイナリになっているように見えますが、明らかにあなたの状況ではありません。
おそらく、バイナリ/イメージモードで転送するようにFTP実装に指示する必要があります。
BufferedInputStream を使用してみてください。これは(動作する)コードサンプルです。
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
res = client.storeFile("File Name", bis);
bis.close();
client.logout();
私にとっては、ftp.setFileType(FTP.BINARY_FILE_TYPE、FTP.BINARY_FILE_TYPE)のみが機能しましたが、ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE)を使用していたときはファイルが破損していました。
これを試して。
objFtpClient.setFileType(FTP.BINARY_FILE_TYPE);
objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);
objFtpClient.enterLocalPassiveMode();
これは Commons NETライブラリのバグ のように見えます。これはバージョン3.0に影響を与えました。バグを修正した新しいバージョン(3.0.1)を試してください。