前文
1、使用FTP的方式进行文件的上传和下载(非SFTP)
2、本人手打,亲测,代码是最简单的,清晰易懂,需要的同学请结合自己的实际添加业务逻辑
2、第三方的jar包:import org.apache.commons.net.ftp.FTPClient;
代码
package Main; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Writer; import java.util.List; import org.apache.commons.io.IOUtils; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import Domain.FileInfoList; import Domain.FtpConfig; import Util.LoggerUtil; public class FTPUtils { public static final String ftp_IP = "192.168.0.6"; public static final Integer ftp_port = 9001; public static final String ftp_user = "Administrator"; public static final String ftp_psw = "123"; public static void main(String args[]) { //download from FTP downloadFromFTP(ftp_IP,ftp_port,ftp_user,ftp_psw,"/","新建文本文档.txt","E:"); //upload from FTP uploadFromFTP(ftp_IP,ftp_port,ftp_user,ftp_psw,"/","E://新建文本文档.txt","新建文本文档.txt"); } /** * @param url IP * @param port 端口 * @param username 用户名 * @param password 密码 * @param remotePath 服务器上的路径 * @param fileName 要下载的文件 * @param localPath 保存到本地的文件 */ public static boolean downloadFromFTP(String url, int port, String username, String password, String remotePath, String fileName, String localPath) { boolean success = false; FTPClient ftp = new FTPClient(); InputStream input=null; BufferedOutputStream writer=null; byte[] by=null; try { int reply; ftp.connect(url, port); // ftp.connect(url); // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 ftp.login(username, password);// 登录 ftp.enterLocalPassiveMode(); ftp.setControlEncoding("gbk"); reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return success; } ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录 FTPFile[] fs = ftp.listFiles(); // 获取当前目录下的所有文件 for (FTPFile ff : fs) { if (new String(ff.getName().getBytes(),"utf-8").equals(fileName)) { //防止出现中文文件名是返回null,强制设置成ISO-8859-1的编码方式进行获取输入流 input=ftp.retrieveFileStream("/"+(new String(ff.getName().getBytes("gbk"), "ISO-8859-1"))); by=new byte[(int)ff.getSize()]; //把文件流保存到byte数组中 input.read(by); //文件输出到目标目录,不需要判断本地目录是否有相同文件,会自动覆盖 writer=new BufferedOutputStream(new FileOutputStream(localPath+"/"+fileName)); writer.write(by); System.out.println("输出指定文件【"+fileName+"】到本地目录:"+localPath+"/"+fileName+"成功"); } } //断开FTP连接 ftp.logout(); success = true; } catch (IOException e) { e.printStackTrace(); } finally { if (ftp.isConnected()) { try { if(writer!=null) { writer.close(); } if(input!=null) { input.close(); } ftp.disconnect(); } catch (IOException ioe) { } } } return success; } /** * ftp上传单个文件 * * @param ftpIP ftp地址 * @param port 端口号 * @param userName ftp的用户名 * @param password ftp的密码 * @param directory 上传至ftp的路径名不包括文件名 * @param localFilePath 要上传的本地文件全路径名 * @param destName 上传至ftp后存储的文件名 * @throws IOException */ public static boolean uploadFromFTP(String ftpIP,Integer port,String userName,String password,String directory,String localFilePath,String destName) { FTPClient ftpClient = new FTPClient(); FileInputStream fis = null; boolean result = false; try { ftpClient.connect(ftpIP, port); ftpClient.login(userName, password); ftpClient.enterLocalPassiveMode(); // 设置上传目录 ftpClient.changeWorkingDirectory(directory); ftpClient.setBufferSize(1024); ftpClient.setConnectTimeout(10*1000); ftpClient.setControlEncoding("gbk"); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); //防止出现中文文件名是返回null,强制把文件名设置成ISO-8859-1的编码方式进行删除指定文件 ftpClient.deleteFile(directory+new String(destName.getBytes("gbk"),"ISO-8859-1")); File srcFile = new File(localFilePath); fis = new FileInputStream(srcFile); //上传到FTP服务器==防止出现中文文件名是返回null,强制把文件名设置成ISO-8859-1的编码方式进行上传 result = ftpClient.storeFile((directory + new String(destName.getBytes("gbk"),"ISO-8859-1")), fis); } catch (NumberFormatException e) { System.err.println("FTP端口配置错误:不是数字:"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(fis); try { ftpClient.disconnect(); } catch (IOException e) { throw new RuntimeException("关闭FTP连接发生异常!", e); } } return result; } }