JAVA实现FTP文件传输
一、FTP介绍
FTP是File Transfer Protocol(文件传输协议)的英文简称,即文件协议。用于Internet上的控制文件的双向传输。同时,它是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有的应用程序都遵守同一种协议以传输文件。在FTP的使用中,用户经常遇到两个概念:下载(Download)和上次(Upload)。下载文件就是从远程主机拷贝文件至自己的计算机上;删除文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向远程主机上传、下载文件(摘自百度百科)。
二、准备工作
1、在服务器安装FTP服务
2、编写Java连接FTP源码
三、实现步骤
1、编写FTP-Config.properties配置属性文件
FTP_IP=localhost
FTP_PORT=21
FTP_USER=wangjunwei
FTP_PASSWORD=wangjunwei
FTP_PATH=/FTP
FTP_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();}}
JAVA实现FTP文件传输相关推荐
- 服务器测试文件怎么创建,如何创建一个“FTPS”模拟服务器以单元测试Java中的文件传输...
我有一个创建FTPS连接的CreateFTPConnection类.使用此连接传输文件.这里是TransferFile类的代码如何创建一个"FTPS"模拟服务器以单元测试Java中 ...
- ftp文件传输工具,5款你会喜欢的ftp文件传输工具
对于ftp文件传输工具,你了解多少?其实一般人也接触不到这种软件.ftp文件传输工具主要是针对从事网站管理的工作人员比较有利的一款工具.可以帮助他们快速的解决工作中的问题.方便.简单.快捷又明了的解决 ...
- 基于python的文件传输程序_7个步骤,教你快速学会用python实现ftp文件传输功能(收藏了)...
文章主要为大家详细介绍了python实现ftp文件传输功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!!! 本文实例为大家分享了python实现ftp文件传输的具体 ...
- 简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么? 参考答案: (1)ftp有两种登录方式:匿名登录和授权登录.使用匿名登录时,用户名为:anonymous ...
- 详解“FTP文件传输服务”安装配置实例
"FTP文件传输服务"安装配置实例 家住海边喜欢浪:zhang789.blog.51cto.com 目录 简介 ftp工作原理 常见的FTP服务 Vsftpd服务器的安装 Vsft ...
- python下载文件传到服务器_python实现FTP文件传输的方法(服务器端和客户端)
用python实现FTP文件传输,包括服务器端和客户端,要求 (1)客户端访问服务器端要有一个验证功能 (2)可以有多个客户端访问服务器端 (3)可以对重名文件重新上传或下载 FTP(File Tra ...
- python下载文件传到服务器_python实现FTP文件传输(服务器端和客户端)
用python实现FTP文件传输,包括服务器端和客户端,要求 (1)客户端访问服务器端要有一个验证功能 (2)可以有多个客户端访问服务器端 (3)可以对重名文件重新上传或下载 FTP(File Tra ...
- Linux 网络服务之FTP 文件传输
Linux FTP 文件传输 --王宇然qq:496488051 实验一:配置匿名上传FTP 1.软件包安装: [root@localhost ~]# cd /misc/cd/Server ...
- 网络协议从入门到底层原理(10)WebSocket、WebService、RESTful、HTTPDNS、FTP文件传输协议、邮件相关协议、IPv6
其他协议 WebSocket WebSocket - 建立连接 WebService RESTful HTTPDNS FTP文件传输协议 邮件相关的协议(SMTP.POP.IMAP) POP vs I ...
最新文章
- c#排序算法(待续)
- Java中Long到Int的精确转换
- runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁
- jenkins用ssh agent插件在pipeline里实现scp和远程执行命令
- 转载------工作10年的人总结的6句话
- Python 基础学习 4 ——字典
- 免费snmp oid下载
- Django 分页器 缓存 信号 序列化
- Java Maps的9个常见问题
- Linux直接复制eclipse也可以使用
- Emacs快捷键的总结
- nvivo12安装包下载
- c语言求婚代码大全,求一个C语言表白的代码
- hive新功能 Cube, Rollup介绍
- 深夜加油站遇到苏格拉底
- 【树莓派】更新树莓派SD卡测速一键脚本,SD卡读写速度测试
- 腾讯视频没有了html分享代码,腾讯视频代码在哪里 腾讯视频嵌入网页的方法-电脑教程...
- Android实现一键开启自由窗口、分屏、画中画模式——画中画模式
- c# ascii转换方法
- 麻省理工大学线性代数1806(2)消元法及矩阵消元法 矩阵行变换、列变换 置换矩阵 逆矩阵 如沐春风、如饮甘露、醍醐灌顶的线性代数