FTPサーバー上の中国語名ファイルのダウンロード後に空になる問題を解決する
2957 ワード
1台のサーバーがあって、コードはGBKで、サーバーの上の中国語のファイルがダウンロードした後にファイルの大きさが0であることを発見して、開いて空白になります.
調査によると、ファイル名の符号化フォーマットが間違っているため、中国語の場合、FTPClientを使用する場合、符号化フォーマットはISO-8859-1を使用する必要がある.
調査によると、ファイル名の符号化フォーマットが間違っているため、中国語の場合、FTPClientを使用する場合、符号化フォーマットはISO-8859-1を使用する必要がある.
:
package com.neusoft.ftptest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
public class FtpMain {
public static void main(String[] args) {
FTPClient client = new FTPClient();
try {
client.connect("10.10.xxx.xxx", 21);
client.login("administrator", "xxx");
System.out.println(client.getControlEncoding());
int reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
client.disconnect();
System.out.println("Login error");
return;
}
client.setControlEncoding("GBK");
// client.segt
System.out.println(client.getCharsetName());
// client.enterRemotePassiveMode();
client.enterLocalPassiveMode();
client.changeWorkingDirectory("11_COMMUNICATION/201204");
System.out.println("---------------------------------------");
String[] names;
names = client.listNames();
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
System.out.println(names.toString());
System.out.println("---------------------------------------");
FTPFile f = client.listFiles()[0];
System.out.println(f.getLink());
client.changeWorkingDirectory("/");
String path = "/10_NOTICE_FILE/201706";
// String path = "/10_NOTICE_FILE/201203/";
client.setBufferSize(1024);
client.setFileType(FTP.BINARY_FILE_TYPE);
client.enterLocalPassiveMode();
client.changeWorkingDirectory(path);
FTPFile[] fs = client.listFiles();
FileOutputStream out = null;
InputStream in = null;
for (int i = 0; i < fs.length; i++) {
FTPFile ff = fs[i];
String outFileName = ff.getName();
System.out.println(outFileName);
//
File localFile = new File("D:\\ftp\\" + ff.getName());
OutputStream fos = new FileOutputStream(localFile);
// ftp ISO-8859-1
String localFileName = new String(ff.getName().getBytes("GBK"), "ISO-8859-1");
client.retrieveFile(localFileName, fos);
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
client.disconnect();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}