最近做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();
- }
- }