最近;项目需要上传归档文件到ftp服务器;我们的javaee项目服务器是IBM的uinx小型机;而FTP服务器是win8server版本的;
jar包用的是apache的commons-net-3.3.jar;
ftpClient.makeDirectory("路径")这个方法是建立文件夹的,在xp(ftp服务器)下可以直接填路径,会自动建立多层文件夹;而在win8server(ftp服务器)下则不能按路径一层一层的建立文件夹;所以必须一层一层建立;
如:
ftpClient.makeDirectory("/AA");
ftpClient.makeDirectory("/AA/BB");
只有AA存在才会在AA文件夹下建立BB文件夹;
还有就是中文目录,上传的文件名乱码的问题;
然后写了一个方法来转换它的编码;
/**
* 转码 (FTP协议里面,规定文件名编码为iso-8859-1,所以只能建转码以后的目录和文件)
* @param str
* @return
* @throws UnsupportedEncodingException
*/
public String transcoding(String str) throws UnsupportedEncodingException {
return new String(str.getBytes("GBK"),"iso-8859-1");
}
还是补上一个完整的上传方法吧:
try {
ftpClient.connect("192.168.1.126");
ftpClient.login("admin", "123");
String f = transcoding("/XX归档文件");
//projectNo是一个变量方便生成不同的文件夹
String f1 = transcoding("/XX归档文件/"+projectNo);
if (!ftpClient.changeWorkingDirectory(f)){
ftpClient.makeDirectory(f);
}
if (!ftpClient.changeWorkingDirectory(f1)){
ftpClient.makeDirectory(f1);
}
ftpClient.changeWorkingDirectory(fn);
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("GBK");
//设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//filename是文件名,fis是输入流,这里应该是文件输入流;把你要上传的东西转成输入流的形式;
ftpClient.storeFile(transcoding(fileName), fis);
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(fis);
ftpClient.disconnect(); //关闭连接
}
还要注意一点,就是文件名或者文件夹名称太长,也不能再windows上面建立文件或者文件夹,名称长度要适合对应的系统;