1 下载需要的jar包
Ftp服务器实现文件的上传和下载,主要依赖jar包为:
2 搭建ftp服务器
参考Windows 上搭建Apache FtpServer,搭建ftp服务器
3 主要代码
在eclipse中实现ftp的上传和下载功能还是很简单的,在编码过程中遇到的一个bug就是对于ftp中中文文件的下载不是乱码,就是下载后文件的大小是0KB。后来发现问题在于eclipse的编码,更改为“utf-8”,在上传和下载的时候,设置ftp服务端目录的名字,编码为iso-8859-1格式。
package T0728; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; class FtpUtil { private FTPClient ftpClient; private String serverIp; private int port; private String userName; private String passWord; public FtpUtil(String serverIp, int port, String userName, String passWord) { super(); this.serverIp = serverIp; this.port = port; this.userName = userName; this.passWord = passWord; } /** * 连接ftp服务器 * @return */ public boolean open(){ if(ftpClient != null && ftpClient.isConnected()) return true; //连接服务器 try{ ftpClient = new FTPClient(); ftpClient.connect(serverIp, port); //连接服务器 ftpClient.login(userName, passWord); //登录 ftpClient.setBufferSize(1024); //设置文件类型,二进制 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); int reply = ftpClient.getReplyCode(); if(!FTPReply.isPositiveCompletion(reply)){ //判断ftp服务器是否连通 this.closeFtp(); System.out.println("FtpServer连接失败!"); return false; } return true; }catch(Exception e){ this.closeFtp(); e.printStackTrace(); return false; } } /** * 关闭ftp服务器,主要是对disconnect函数的调用 */ public void closeFtp() { try { if (ftpClient != null && ftpClient.isConnected()) ftpClient.disconnect(); } catch (Exception e) { e.printStackTrace(); } System.out.println("Close Server Success :"+this.serverIp+";port:"+this.port); } /** * 从ftp服务器下载文件 * @param ftpDirectoryAndFileName 包含ftp部分的文件路径和名字,这里是从ftp设置的根目录开始 * @param localDirectoryAndFieName 本文的文件路径和文件名字,相当于是绝对路径 * @return */ public boolean donwLoad(String ftpDirectoryAndFileName,String localDirectoryAndFieName){ if(!ftpClient.isConnected()){ return false; } FileOutputStream fos =null; try { fos = new FileOutputStream(localDirectoryAndFieName); //下面的函数实现文件的下载功能,参数的设置解决了ftp服务中的中文问题。这里要记得更改eclipse的编码格式为utf-8 ftpClient.retrieveFile(new String(ftpDirectoryAndFileName.getBytes(), "iso-8859-1"), fos); fos.close(); return true; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); return false; }finally{ this.closeFtp(); } } /** *从本地上传文件到ftp服务器 * @param ftpDirectoryAndFileName * @param localDirectoryAndFieName * @return */ public boolean upLoading(String ftpDirectoryAndFileName,String localDirectoryAndFieName){ if(!ftpClient.isConnected()){ return false; } FileInputStream fis = null; try { fis = new FileInputStream(localDirectoryAndFieName); //和文件的下载基本一致,但是要注意流的写法 ftpClient.storeFile(new String(ftpDirectoryAndFileName.getBytes(), "iso-8859-1"), fis); fis.close(); return true; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); return false; }finally{ this.closeFtp(); } } }
测试代码
package T0728; public class FtpMain { public static void main(String[] args) { // TODO Auto-generated method stub FtpUtil ftpUtil = new FtpUtil("168.33.51.174", 2121, "admin", "123456"); if(ftpUtil.open()){ //ftpUtil.donwLoad("/中.txt", "E:/ftp2/中文.txt"); ftpUtil.upLoading("/hh/2.mp3", "E:/ftp2/1.mp3"); } } }