最近;项目需要上传归档文件到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上面建立文件或者文件夹,名称长度要适合对应的系统;