最近的一个项目跟ftp打交道很多,经常需要向ftp上传、下载文件,现在总结一下公共方法。
上传
/** * 文件上传 * * @param ip * host * @param port * 端口 * @param userName * 用户名 * @param passWord * 密码 * @param localpath * 上传文件在本地磁盘路径 * @param fileName * 文件名 * @param remotePath * 文件要上传到ftp服务器的路径 * @throws Exception */ public static Boolean fileFtpUpload(String ip, int port, String userName, String passWord, String localpath, String fileName, String remotePath) throws Exception { FTPClient ftp = new FTPClient();// 创建客户端对象 InputStream local = null; boolean flag = false; try { checkIsExsitFile(localpath, fileName);// 判断本地路径下有无该文件 SocketAddress address = new InetSocketAddress(ip, port); ftp.connect(ip, port);// 连接 ftp.login(userName, passWord);// 登录 log.info("ftp服务器连接、登陆成功,地址为:" + address); // 检查上传路径是否存在 如果不存在返回false boolean flag1 = ftp.changeWorkingDirectory(remotePath); if (!flag1) { // 创建上传的路径 该方法只能创建一级目录,在这里如果/home/ftpuser存在则可创建image // ftp.makeDirectory(path); throw new Exception("ftp服务器上没有指定文件目录,请先创建:" + remotePath); } // 指定上传路径 ftp.changeWorkingDirectory(remotePath); // 指定上传文件的类型 二进制文件 ftp.setFileType(FTP.BINARY_FILE_TYPE); // 读取本地文件 File file = new File(localpath + "\\" + fileName); local = new FileInputStream(file); // 第一个参数是文件名 ftp.storeFile(file.getName(), local); log.info("上传成功"); flag = true; } catch (SocketException e) { log.info("上传失败" + e); flag = false; e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { // 关闭文件流 local.close(); // 退出 ftp.logout(); // 断开连接 ftp.disconnect(); } catch (IOException e) { e.printStackTrace(); } } return flag; }
上传文件之前需要先判断磁盘下有无指定文件,判断方法如下:
/** * 判断文件路径下有无指定文件 * * @param filePath * 生成文件名称 * @param fileName * 文件名称 * @return 是否创建成功,成功则返回true */ public static void checkIsExsitFile(String filePath, String fileName) { File dirFile = new File(filePath);// 文件夹对象 try { File[] files = dirFile.listFiles(); Boolean bl = false; for (File file1 : files) { if (fileName.equals(file1.getName())) { bl = true; break; } } // 如果文件夹内文件不存在,则报错 if (!bl) { throw new Exception("文件路径下没有指定上传文件"); } } catch (Exception e) { e.printStackTrace(); } }
注意在上传之前一定要先切换到当前目录,即这一行
// 指定上传路径 ftp.changeWorkingDirectory(remotePath);
同时需要指定上传文件的类型
// 指定上传文件的类型 二进制文件 ftp.setFileType(FTP.BINARY_FILE_TYPE);
下载
/** * ftp下载文件 * * @param ip * @param port * @param userName * @param passWord * @param localPath * @param remotePath * @param fileContainsName * 文件包含名 * @return * @throws Exception */ public static String fileFtpDown(String ip, int port, String userName, String passWord, String localPath, String remotePath, String fileContainsName) throws Exception { FTPClient ftpClient = new FTPClient();// 创建客户端对象 String fileName = ""; SocketAddress address = new InetSocketAddress(ip, port); ftpClient.connect(ip, port);// 连接 boolean login = ftpClient.login(userName, passWord);// 登陆 if (login) { try { log.info("ftp服务器连接、登陆成功,地址为:" + address); ftpClient.enterLocalPassiveMode();// 开通一个端口来传输数据 FTPFile[] fs = ftpClient.listFiles(remotePath);// fs为remoteFile下所有文件集合 for (FTPFile ff : fs) { String f = new String(ff.getName().getBytes("iso-8859-1"), "utf-8"); if (f.contains(fileContainsName)) {// 文件名称不确定时用contains File localFile = new File(localPath + "\\" + f); // 在本地指定路径创建了一个对象 OutputStream is = new FileOutputStream(localFile); ftpClient.changeWorkingDirectory(remotePath);// 设置下载文件相对远程FTP根目录所处的路径 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 开始下载文件前设置传输类型 ftpClient.retrieveFile(ff.getName(), is); is.close(); fileName = f; } break; } } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { } } } } else { log.info("ftp服务器连接、登陆失败"); } return fileName; }
原文地址:https://www.cnblogs.com/xu-zheng/p/8994454.html
时间: 2024-10-11 13:52:17