首先要开启ftp服务器,我们使用系统自带的ftp服务器即可,windows7系统下ftp服务器开启方式:
Windows_7下搭建FTP服务器.pdf
其次下载相关jar包,使用ftp协议上传下载时常用的jar包commons-net-1.4.1.jar,下载即可:
commons-net-1.4.1.jar
再次新建java项目编写代码:
package com.ftp; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; public class FTPTest { /** * Description: 向FTP服务器上传文件 * @Version1.0 * @param url FTP服务器hostname * @param port FTP服务器端口 * @param username FTP登录账号 * @param password FTP登录密码 * @param path FTP服务器保存目录 * @param filename 上传到FTP服务器上的文件名 * @param input 输入流 * @return 成功返回true,否则返回false */ public static boolean uploadFile(String url, int port, String username, String password, String path, String filename, InputStream input) { boolean flag = false; FTPClient ftp = new FTPClient(); // 创建FTPClient对象 try { int reply; // 连接FTP服务器 // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 ftp.connect(url, port); ftp.login(username, password); // 登录 reply = ftp.getReplyCode(); // 看返回的值是不是230,如果是,表示登陆成功 if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return flag; } ftp.changeWorkingDirectory(path); // 转到指定上传目录 ftp.storeFile(filename, input); // 将上传文件存储到指定目录 input.close(); // 关闭输入流 ftp.logout(); // 退出ftp flag = true; //表示上传成功 } catch (IOException e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { } } } return flag; } /** * Description: 从FTP服务器下载指定文件名的文件 * @Version1.0 * @param url FTP服务器hostname * @param port FTP服务器端口 * @param username FTP登录账号 * @param password FTP登录密码 * @param remotePath FTP服务器上的相对路径 * @param fileName 要下载的文件名 * @param localPath 下载后保存到本地的路径 * @return */ public static boolean downFile(String url, int port, String username, String password, String remotePath, String fileName, String localPath) { boolean flag = false; FTPClient ftp = new FTPClient(); // 创建FTPClient对象 try { int reply; // 如果采用默认端口21,可以使用ftp.connect(url)的方式直接连接FTP服务器 ftp.connect(url); ftp.login(username, password); // 登录 reply = ftp.getReplyCode(); // 看返回的值是不是230,如果是,表示登陆成功 if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return flag; } ftp.changeWorkingDirectory(remotePath); // 转移到FTP服务器目录 String[] names = ftp.listNames(); // 列出该目录下所有文件的文件名,包括后缀 // 遍历所有文件名,找到指定的文件 for (String fn : names) { if (fn.equals(fileName)) { File localFile = new File(localPath + "/" + fn); // 根据绝对路径初始化文件 OutputStream is = new FileOutputStream(localFile); // 输出流 ftp.retrieveFile(fn, is); //下载文件 is.close(); } } ftp.logout(); //退出ftp flag = true; //下载成功 } catch (Exception e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { ftp.disconnect(); } catch (Exception ioe) { } } } return flag; } }
最后测试编写的代码是否OK(使用了Junit4)
package com.test; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import junit.framework.TestCase; import org.junit.Test; import com.ftp.FTPTest; public class ftpTest extends TestCase { @Test public void testUpLoadFromDisk() { //上传文件,本地需要有这个将要上传的文件,没有就会报错 try { FTPTest ft = new FTPTest(); FileInputStream in = new FileInputStream(new File("D:/test.txt")); boolean flag = FTPTest.uploadFile("127.0.0.1", 21, "test", "test", "D:/ftp", "test.txt", in); System.out.println(flag); } catch (FileNotFoundException e) { e.printStackTrace(); } } @Test public void testUpLoadFromString() { //上传文件,本地不需要有这个将要上传的文件 try { FTPTest ft = new FTPTest(); InputStream input = new ByteArrayInputStream("test ftp(你好!)".getBytes("utf-8")); boolean flag = ft.uploadFile("127.0.0.1", 21, "test", "test", "D:/ftp", "test.txt", input); System.out.println(flag); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } @Test public void testDownLoadFromString(){ //下载指定文件名的文件到本地 try{ FTPTest ft = new FTPTest(); boolean flag = ft.downFile("127.0.0.1", 21, "test", "test", "/ftp", "test.txt", "D:"); System.out.println(flag); }catch(Exception e){ e.printStackTrace(); } } }