最近做ftp上传遇到问题,最终解决,现在分享给大家。
这里有四点:
1、将字符串转换成输入流
String s = "this is my test string 中国";
//将字符串转换成输入流
ByteArrayInputStream fis = new ByteArrayInputStream(s.getBytes());
2、设置编码
ftp.setControlEncoding("GBK");
3、设置为被动模式
ftp.enterLocalPassiveMode();
4、上传和下载文件名称编码,当文件名为中文时,上传下载可能需要编码
//上传文件名称
boolean fb = ftp.storeFile(new String("test中文.csv".getBytes("GBK"),"iso8859-1"), fis);
最终测试代码如下:
package ftpTest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
public class ApacheFtpTest {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
String s = "this is my test string 中国";
//将字符串转换成输入流
ByteArrayInputStream fis = new ByteArrayInputStream(s.getBytes());
FTPClient ftp = new FTPClient();
//host,端口
ftp.connect("127.0.0.1", 21);
//必须设置,上传非iisc文件,如果不设置默认是iisc码格式传输,导致文件坏死
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//如果遍历文件名乱码,请设置为GBK,或者你需要的编码
ftp.setControlEncoding("GBK");
//超时时间必须设置,方式长时间连接没响应
ftp.setControlKeepAliveReplyTimeout(15000);
ftp.setConnectTimeout(15000);
ftp.setControlKeepAliveTimeout(15000);
//设置被动模式,在很多情况下由于防火墙等原因,主动模式不支持。
ftp.enterLocalPassiveMode();
//帐户密码
ftp.login("帐户", "密码");
System.out.println("login success");
//服务器路径
ftp.changeWorkingDirectory("/");
//上传文件名称
ftp.storeFile("test.txt", fis);
//上传文件名称
//boolean fb = ftp.storeFile(new String("test中文.csv".getBytes("GBK"),"iso8859-1"), fis);
ftp.logout();
}
}