使用APACHE下的Commons Net连接FTP
内容出处https://study.163.com/course/courseMain.htm?courseId=1209288803
APACHE官网连接
Commons Net下载地址
找到Net点进去
http://commons.apache.org/proper/commons-net/
下载地址
http://commons.apache.org/proper/commons-net/download_net.cgi
官方例子
API帮助
放到项目里的jar包
项目小例子,源代码
package my;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.text.SimpleDateFormat;import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPFile;import org.apache.commons.net.ftp.FTPReply;import org.omg.CORBA.portable.InputStream;public class test { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub FTPClient ftp = new FTPClient(); //连接服务器 ftp.connect("192.168.1.101", 100); boolean reply = ftp.isConnected(); if(!reply) { System.out.println("** 无法连接至FTP服务器"); System.exit(1); } // int reply = ftp.getReplyCode();// if(!FTPReply.isPositiveCompletion(reply));// {// ftp.disconnect();// System.out.println("** 无法连接至FTP服务器");// System.exit(1);// } if(!ftp.login("administrator", "Lu123456")) { ftp.logout(); System.out.println("** 错误的用户或密码"); System.exit(1); } System.out.println("Connected."); //字节传输BINARY_FILE_TYPE //文本传输ASCII_FILE_TYPE //一般使用BINARY模式来传输文件,很少使用ASCII_FILE_TYPE ftp.setFileType(FTP.BINARY_FILE_TYPE); //主动模式:enterLocalActiveMode() //被动模式:enterLocalPassiveMode() //一般选择被动模式 ftp.enterLocalPassiveMode(); //设置控制通道的字符集,要与服务端的设定一直 ftp.setControlEncoding("GBK");//用GBK或者UTF-8 //切换目录,设置当前目录(用ftpPath()转换一下) boolean rc = ftp.changeWorkingDirectory(ftpPath("/视频")); if(!rc) { System.out.println("切换目录出错!"); } //列出所有的文件/子目录 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("> list"); FTPFile[] ftpFiles = ftp.listFiles();//查看目录 for(FTPFile f : ftpFiles) { String time = sdf.format(f.getTimestamp().getTime()); String info = ""; if(f.isDirectory()) info = String.format("+ %-20s", f.getName()); else info = String.format(" %-20s %8d %s", f.getName(), f.getSize(), time); System.out.println(info); } //创建目录 ftp.makeDirectory(ftpPath("/音乐")); //删除目录 ftp.removeDirectory(ftpPath("/图片")); //重命名 ftp.rename(ftpPath("/文档.docx"), ftpPath("/改了名字的文档.docx")); //上传文件 File uploadFile = new File("D:/1/2/ABC.docx"); FileInputStream uploadInStream = new FileInputStream(uploadFile); String remotePath = ftpPath(uploadFile.getName()); //小文件直接用 //ftp.storeFile(remotePath, uploadInStream); //大文件,可以自己掌握进度 OutputStream uploadOutStream = ftp.storeFileStream(remotePath); byte[] uploadBuffer = new byte[4000]; while(true) { int n = uploadInStream.read(uploadBuffer); if(n <= 0) break; uploadOutStream.write(uploadBuffer, 0, n); } uploadInStream.close(); uploadOutStream.close(); // //下载文件// String remptePath = ftpPathGbk("/演示文稿.pptx");//服务器文件路径// File localFile = new File("D:/1/2/演示文稿.pptx");//下载到本地的路径// localFile.getParentFile().mkdirs();// OutputStream outStream = new FileOutputStream(localFile);// // //小文件直接用// //ftp.retrieveFile(remptePath, outStream);// // //大文件,可以自己掌握进度// java.io.InputStream inStream = ftp.retrieveFileStream(remptePath);// if(inStream == null)// throw new Exception("远程文件不存在!" + remptePath);// // byte[] buffer = new byte[4000];// while(true)// {// int n = inStream.read(buffer);// if(n <= 0) break;// // outStream.write(buffer, 0, n);// }// inStream.close();// outStream.close(); ftp.logout(); ftp.disconnect(); System.out.println("Ouit."); } //API里对中文FTP目录的处理有点问题 //在调用changeWorkingDirectory() / listFiles()等方法时,将参数路径转换一下 private static String ftpPath(String path) { try { return new String(path.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING); }catch(UnsupportedEncodingException e) { return ""; } } }
演示
程序员阿飞
2021年5月22日