JAVA实现FTP文件传输
来源:互联网 发布:yum安装 编辑:程序博客网 时间:2024/06/15 11:36
一、FTP介绍
FTP是File Transfer Protocol(文件传输协议)的英文简称,即文件协议。用于Internet上的控制文件的双向传输。同时,它是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有的应用程序都遵守同一种协议以传输文件。在FTP的使用中,用户经常遇到两个概念:下载(Download)和上次(Upload)。下载文件就是从远程主机拷贝文件至自己的计算机上;删除文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向远程主机上传、下载文件(摘自百度百科)。
二、准备工作
1、在服务器安装FTP服务
FTP服务需要下FileZilla_Server服务安装程序,大家可以在网上搜索,也可以通过我的资源下载点击下载
2、编写Java连接FTP源码
大家也可以通过CSDN资源下载我的源码点击下载
三、实现步骤
1、编写FTP-Config.properties配置属性文件
FTP_IP=localhostFTP_PORT=21FTP_USER=wangjunweiFTP_PASSWORD=wangjunweiFTP_PATH=/FTPFTP_DRIVELETTER=E:
2、编写FTPUtil读取FTP配置属性文件
/** * FTP服务地址 */private static String FTP_IP;/** * FTP端口号 */private static Integer FTP_PORT;/** * FTP用户名 */private static String FTP_USER;/** * FTP密码 */private static String FTP_PASSWORD;/** * FTP根路径 */private static String FTP_PATH;/** * 映射盘符 */private static String FTP_DRIVELETTER;static{try {Properties properties = new Properties();InputStream inputStream = FtpUtil.class.getResourceAsStream("/FTP-Config.properties");properties.load(inputStream);FTP_IP = properties.getProperty("FTP_IP");FTP_PORT = Integer.valueOf(properties.getProperty("FTP_PORT"));FTP_USER = properties.getProperty("FTP_USER");FTP_PASSWORD = properties.getProperty("FTP_PASSWORD");FTP_PATH = properties.getProperty("FTP_PATH");FTP_DRIVELETTER = properties.getProperty("FTP_DRIVELETTER");} catch (IOException e) {e.printStackTrace();}}
3、连接(登录)FTP服务端获取授权
private static FTPClient ftpClient;public static FTPClient connectionFTPServer() {ftpClient = new FTPClient();try {ftpClient.connect(FtpUtil.getFTP_IP(), FtpUtil.getFTP_PORT());ftpClient.login(FtpUtil.getFTP_USER(), FtpUtil.getFTP_PASSWORD());if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {logger.info("==============未连接到FTP,用户名或密码错误=================");ftpClient.disconnect();} else {logger.info("==============连接到FTP成功=================");}} catch (SocketException e) {e.printStackTrace();logger.info("==============FTP的IP地址错误==============");} catch (IOException e) {e.printStackTrace();logger.info("==============FTP的端口错误==============");}return ftpClient;}
4、编写文件上传、下载相关方法
/** * 切换到父目录 * * @return 切换结果 true:成功, false:失败 */private static boolean changeToParentDir() {if (!ftpClient.isConnected()) {return false;}try {return ftpClient.changeToParentDirectory();} catch (IOException e) {e.printStackTrace();return false;}}/** * 改变当前目录到指定目录 * * @param dir * 目的目录 * @return 切换结果 true:成功,false:失败 */private static boolean cd(String dir) {if (!ftpClient.isConnected()) {return false;}try {return ftpClient.changeWorkingDirectory(dir);} catch (IOException e) {e.printStackTrace();return false;}}/** * 获取目录下所有的文件名称 * * @param filePath * 指定的目录 * @return 文件列表,或者null */private static FTPFile[] getFileList(String filePath) {if (!ftpClient.isConnected()) {return null;}try {return ftpClient.listFiles(filePath);} catch (IOException e) {e.printStackTrace();return null;}}/** * 切换工作目录 * * @param ftpPath * 目的目录 * @return 切换结果 */public static boolean changeDir(String ftpPath) {if (!ftpClient.isConnected()) {return false;}try {// 将路径中的斜杠统一char[] chars = ftpPath.toCharArray();StringBuffer sbStr = new StringBuffer(256);for (int i = 0; i < chars.length; i++) {if ('\\' == chars[i]) {sbStr.append('/');} else {sbStr.append(chars[i]);}}ftpPath = sbStr.toString();if (ftpPath.indexOf('/') == -1) {// 只有一层目录ftpClient.changeWorkingDirectory(new String(ftpPath.getBytes(), "iso-8859-1"));} else {// 多层目录循环创建String[] paths = ftpPath.split("/");for (int i = 0; i < paths.length; i++) {ftpClient.changeWorkingDirectory(new String(paths[i].getBytes(), "iso-8859-1"));}}return true;} catch (Exception e) {e.printStackTrace();return false;}}/** * 循环创建目录,并且创建完目录后,设置工作目录为当前创建的目录下 * * @param ftpPath * 需要创建的目录 * @return */public static boolean mkDir(String ftpPath) {if (!ftpClient.isConnected()) {return false;}try {// 将路径中的斜杠统一char[] chars = ftpPath.toCharArray();StringBuffer sbStr = new StringBuffer(256);for (int i = 0; i < chars.length; i++) {if ('\\' == chars[i]) {sbStr.append('/');} else {sbStr.append(chars[i]);}}ftpPath = sbStr.toString();if (ftpPath.indexOf('/') == -1) {// 只有一层目录ftpClient.makeDirectory(new String(ftpPath.getBytes(), "iso-8859-1"));ftpClient.changeWorkingDirectory(new String(ftpPath.getBytes(), "iso-8859-1"));} else {// 多层目录循环创建String[] paths = ftpPath.split("/");for (int i = 0; i < paths.length; i++) {ftpClient.makeDirectory(new String(paths[i].getBytes(), "iso-8859-1"));ftpClient.changeWorkingDirectory(new String(paths[i].getBytes(), "iso-8859-1"));}}return true;} catch (Exception e) {e.printStackTrace();return false;}}/** * 上传单个文件 * * @param inputStream * 单个文件流对象 * @param newFileName * 新文件名 * @param folder * 自定义保存的文件夹 * @return 上传结果 */public static boolean uploadSingleAttachment(File file, String newFileName, String folder) {FtpUtil.connectionFTPServer();if (!ftpClient.isConnected()) {logger.info("==============FTP服务已断开==============");return false;}boolean result = false;if (ftpClient != null) {FileInputStream fileInputStream = null;try {fileInputStream = new FileInputStream(file);if(StringUtils.isNotEmpty(folder)){FtpUtil.mkDir(folder);}ftpClient.setBufferSize(100000);ftpClient.setControlEncoding("utf-8");ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);result = ftpClient.storeFile(new String(newFileName.getBytes(), "iso-8859-1"), fileInputStream);} catch (Exception e) {FtpUtil.close();e.printStackTrace();return false;} finally {try {if (ftpClient.isConnected()) {FtpUtil.close();}fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}}return result;}/** * 上传多个文件 * * @param inputStreams * 多文件流对象数组 * @param newFileNames * 多文件名数组(与流对象数组一一对应) * @param folder * 自定义保存的文件夹 * @return 上传结果 */public static String[] uploadBatchAttachment(File[] files , String[] newFileNames, String folder) {String[] filesSaveUrls = new String[files.length];FtpUtil.connectionFTPServer();if (!ftpClient.isConnected()) {logger.info("==============FTP服务已断开==============");return null;}if (ftpClient != null) {FileInputStream fileInputStream = null;try {if(StringUtils.isNotEmpty(folder)){FtpUtil.mkDir(folder);}for (int i = 0; i < files.length; i++) {filesSaveUrls[i] = FtpUtil.FTP_PATH;fileInputStream = new FileInputStream(files[i]);if(StringUtils.isNotEmpty(folder)){filesSaveUrls[i] += "/"+folder;}ftpClient.setBufferSize(100000);ftpClient.setControlEncoding("utf-8");ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);ftpClient.storeFile(new String(newFileNames[i].getBytes(), "iso-8859-1"), fileInputStream);filesSaveUrls[i] += "/"+newFileNames[i];}} catch (Exception e) {FtpUtil.close();e.printStackTrace();return null;} finally {try {if (ftpClient.isConnected()) {FtpUtil.close();}fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}}return filesSaveUrls;}/** * 上传单个文件 * * @param inputStreams * 多文件流对象数组 * @param newFileNames * 多文件名数组(与流对象数组一一对应) * @param folder * 自定义保存的文件夹 * @return 上传结果 */public static String uploadSingleAttachment(MultipartFile multipartFile, String newFileName, String folder) {String filesSaveUrl = null;FtpUtil.connectionFTPServer();if (!ftpClient.isConnected()) {logger.info("==============FTP服务已断开==============");return null;}if (ftpClient != null) {try {if(StringUtils.isNotEmpty(folder)){FtpUtil.mkDir(folder);}filesSaveUrl = FtpUtil.FTP_PATH;if(StringUtils.isNotEmpty(folder)){filesSaveUrl += "/"+folder;}ftpClient.setBufferSize(100000);ftpClient.setControlEncoding("utf-8");ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);ftpClient.storeFile(new String(newFileName.getBytes(), "iso-8859-1"), multipartFile.getInputStream());filesSaveUrl += "/"+newFileName;} catch (Exception e) {FtpUtil.close();e.printStackTrace();return null;} finally {if (ftpClient.isConnected()) {FtpUtil.close();}}}return filesSaveUrl;}/** * 上传多个文件 * * @param inputStreams * 多文件流对象数组 * @param newFileNames * 多文件名数组(与流对象数组一一对应) * @param folder * 自定义保存的文件夹 * @return 上传结果 */public static String[] uploadBatchAttachment(MultipartFile[] multipartFiles , String[] newFileNames, String folder) {String[] filesSaveUrls = new String[multipartFiles.length];FtpUtil.connectionFTPServer();if (!ftpClient.isConnected()) {logger.info("==============FTP服务已断开==============");return null;}if (ftpClient != null) {InputStream inputStream = null;try {if(StringUtils.isNotEmpty(folder)){FtpUtil.mkDir(folder);}for (int i = 0; i < multipartFiles.length; i++) {filesSaveUrls[i] = FtpUtil.FTP_PATH;inputStream = multipartFiles[i].getInputStream();if(StringUtils.isNotEmpty(folder)){filesSaveUrls[i] += "/"+folder;}ftpClient.setBufferSize(100000);ftpClient.setControlEncoding("utf-8");ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);ftpClient.storeFile(new String(newFileNames[i].getBytes(), "iso-8859-1"), inputStream);filesSaveUrls[i] += "/"+newFileNames[i];}} catch (Exception e) {FtpUtil.close();e.printStackTrace();return null;} finally {try {if (ftpClient.isConnected()) {FtpUtil.close();}inputStream.close();} catch (IOException e) {e.printStackTrace();}}}return filesSaveUrls;}/** * 根据文件url下载文件 * * @param path 被下载文件url * @return 文件流对象 * @throws IOException */public static final InputStream downLoadFile(String path,String filaName){FtpUtil.connectionFTPServer();if (!ftpClient.isConnected()) {logger.info("==============FTP服务已断开==============");return null;} ftpClient.enterLocalPassiveMode(); FtpUtil.changeDir(path); try {return ftpClient.retrieveFileStream(filaName);} catch (IOException e) {logger.info("==============获取文件异常==============");e.printStackTrace();return null;}finally{if (ftpClient.isConnected()) {FtpUtil.close();}}} /** * 返回FTP目录下的文件列表 * * @param pathName * @return */public static String[] getFileNameList(String pathName) {if (!ftpClient.isConnected()) {return null;}try {return ftpClient.listNames(pathName);} catch (IOException e) {e.printStackTrace();return null;}}/** * 删除FTP上的文件 * * @param ftpDirAndFileName * 路径开头不能加/,比如应该是test/filename1 * @return */public static boolean deleteFile(String ftpDirAndFileName) {if (!ftpClient.isConnected()) {FtpUtil.connectionFTPServer();}try {return ftpClient.deleteFile(ftpDirAndFileName);} catch (IOException e) {e.printStackTrace();return false;}}/** * 删除FTP目录 * * @param ftpDirectory * @return */public static boolean deleteDirectory(String ftpDirectory) {if (!ftpClient.isConnected()) {return false;}try {return ftpClient.removeDirectory(ftpDirectory);} catch (IOException e) {e.printStackTrace();return false;}}/** * 关闭链接 */public static void close() {try {if (ftpClient != null && ftpClient.isConnected()) {ftpClient.disconnect();}} catch (Exception e) {e.printStackTrace();}}
阅读全文
0 0
- JAVA实现FTP文件传输
- Python FTP文件传输实现
- java FTP 文件传输
- java使用Apache工具集实现ftp文件传输
- AsyncSocket实现 FTP的文件传输
- java实现文件传输
- java udp实现文件传输
- Java实现:文件传输
- java实现socket文件传输
- java实现socket文件传输
- java Socket实现文件传输
- Java Socket实现文件传输
- Java Socket实现文件传输
- ftp文件传输
- ftp文件传输
- FTP文件传输
- FTP文件传输
- 通过Socket实现文件传输(Java)
- 企业级搜索elasticsearch应用02-elasticsearch搜索
- STM32的固件库和CubeMX
- JAVA基础一
- 为何会需要点击两次
- 【Docker】docker 学习
- JAVA实现FTP文件传输
- 124. Binary Tree Maximum Path Sum
- kotlin学习笔记(一)
- Windows下安装LiteIDE
- 多地实时管控8台服务器解决方案
- 使用CrashHandler来获取应用的crash信息
- 一部ASO史,一场史无前例的推广之战
- 卡拉兹(Callatz)猜想,PAT(Basic Level) Practise NO.1001
- xauth: “timeout in locking authority file /home/<user>/.Xauthority”