一、服务器安装

操作系统Ubuntu:sudo apt-get install vsftpd操作系统Centos:sudo yum install -y vsftpd##创建ftps用户,设置默认目录
useradd -d /home/ftp ftpname
passwd ftpuse123##设置用户权限,不能登录
usermod -s /sbin/nologin ftpname ##修改用户默认目录
usermod -d /ftp ftpname## 备份原始配置文件
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak################ vsftpd.conf ################listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
pam_service_name=ftp
idle_session_timeout=600
data_connection_timeout=120
listen_port=10021
pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=18700
pasv_max_port=18790
port_enable=YES
#日志文件
xferlog_file=/var/log/xferlog
#使用标准文件日志
xferlog_std_format=YES
#是否允许上传二进制文件
ascii_upload_enable=YES
#是否允许下载二进制文件
ascii_download_enable=YES#是否启用SSL,默认NO
ssl_enable=YES
#是否激活sslv2加密,默认NO
ssl_sslv2=YES
#是否激活sslv3加密,默认NO
ssl_sslv3=YES
#是否激活tls v1加密,默认NO
ssl_tlsv1=YES
#非匿名用户登陆时是否加密
force_local_logins_ssl=YES
#非匿名用户传输数据时是否加密
force_local_data_ssl=YES
#ssl证书位置
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem################ vsftpd.conf ################## 证书生成地址,可自定义,配置文件中对应即可
mkdir -p /etc/vsftpd/.sslkeysudo openssl req -new -x509 -nodes -days 3650 -out vsftpd.pem -keyout vsftpd.pem##按提示输入相关信息即可

服务启动/重启/停止

systemctl start/restart/stop vsftpd

1.2 centos的安装方式

sudo yum install -y vsftpd
## 服务和配置文件都在/etc/vsftpd下

二、代码案例
切记不要使用3.1,有坑

 <dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version></dependency>
@Slf4j
public class SSLSessionReuseFtpsClient extends FTPSClient {/*** @param command the command to get* @param remote  the remote file name* @param local   the local file name* @return true if successful* @throws IOException on error* @since 3.1*/@Overrideprotected boolean _retrieveFile(String command, String remote, OutputStream local) throws IOException {Socket socket = _openDataConnection_(command, remote);if (socket == null) {return false;}final InputStream input;input = new BufferedInputStream(socket.getInputStream());// Treat everything else as binary for nowtry {Util.copyStream(input, local, getBufferSize(), CopyStreamEvent.UNKNOWN_STREAM_SIZE, null, false);} finally {Util.closeQuietly(input);Util.closeQuietly(socket);}// Get the transfer responsereturn completePendingCommand();}@Overrideprotected void _prepareDataSocket_(final Socket socket) throws IOException {if (socket instanceof SSLSocket) {// Control socket is SSLfinal SSLSession session = ((SSLSocket) _socket_).getSession();final SSLSessionContext context = session.getSessionContext();try {final Field sessionHostPortCache = context.getClass().getDeclaredField("sessionHostPortCache");sessionHostPortCache.setAccessible(true);final Object cache = sessionHostPortCache.get(context);final Method method = cache.getClass().getDeclaredMethod("put", Object.class, Object.class);method.setAccessible(true);final String key = String.format("%s:%s", socket.getInetAddress().getHostName(), String.valueOf(socket.getPort())).toLowerCase(Locale.ROOT);method.invoke(cache, key, session);} catch (NoSuchFieldException e) {e.printStackTrace();// Not running in expected JRElog.error("No field sessionHostPortCache in SSLSessionContext");} catch (Exception e) {// Not running in expected JREe.printStackTrace();}}}
}
@Slf4j
public class FtpsUtils {private static SSLSessionReuseFtpsClient ftpsClient = null;public static final String PATH_SUFFIX = "/";/*** 登录认证** @return true/false*/public static boolean login(String ip, int port, String username, String password) {try {//设置环境变量System.setProperty("jdk.tls.useExtendedMasterSecret", "false");ftpsClient = new SSLSessionReuseFtpsClient();FTPClientConfig config = new FTPClientConfig();ftpsClient.configure(config);// 打印调用日志,调试时使用,上线后注释ftpsClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));ftpsClient.setControlEncoding("utf-8");FtpsProperties ftpsProperties = BeanUtil.getBean(FtpsProperties.class);ftpsClient.connect(ip, port);ftpsClient.login(username, password);int reply = ftpsClient.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {ftpsClient.disconnect();return false;}// 主动模式,PORT模式。通知客户端打开一个数据端口,服务端将连接到这个端口进行数据传输。// ftpsClient.enterRemotePassiveMode();// 被动模式,PASV模式。通知服务器打开一个数据端口,客户端将连接到这个端口进行数据传输。ftpsClient.enterLocalPassiveMode();// 流传输模式ftpsClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);// 数据连接超时(以毫秒为单位),vsftpd配置文件默认120sftpsClient.setDataTimeout(18000);// 数据通道保护级别ftpsClient.execPROT("P");ftpsClient.setFileType(FTP.BINARY_FILE_TYPE);ftpsClient.setBufferSize(1024);log.info("ftps连接成功....ip={},port={}", ip, port);return true;} catch (Exception e) {e.printStackTrace();}return false;}/*** 上传文件** @param directory 服务端路径* @param file      本地文件路径*/public static boolean uploadFile(String directory, File file) {try {if (createDirectory(directory)) {ftpsClient.storeFile(file.getName(), new FileInputStream(file));ftpsClient.logout();log.info("附件上传成功!远程文件路径:{}", directory);return true;}} catch (Exception e) {e.printStackTrace();} finally {if (ftpsClient.isConnected()) {try {ftpsClient.disconnect();} catch (IOException e) {e.printStackTrace();}}}return false;}/*** 创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建** @param remote 目录*/public static boolean createDirectory(String remote) {String directory = remote;try {if (!remote.endsWith(PATH_SUFFIX)) {directory = directory + PATH_SUFFIX;}// 如果远程目录不存在,则递归创建远程服务器目录if (!PATH_SUFFIX.equals(directory) && !ftpsClient.changeWorkingDirectory(directory)) {int start;int end;if (directory.startsWith(PATH_SUFFIX)) {start = 1;} else {start = 0;}end = directory.indexOf(PATH_SUFFIX, start);StringBuilder path = new StringBuilder();StringBuilder paths = new StringBuilder();do {String subDirectory = remote.substring(start, end);path.append(path).append(PATH_SUFFIX).append(subDirectory);// 目录不存在就创建if (!ftpsClient.changeWorkingDirectory(subDirectory)) {if (ftpsClient.makeDirectory(subDirectory)) {ftpsClient.changeWorkingDirectory(subDirectory);}}paths.append(paths).append(PATH_SUFFIX).append(subDirectory);start = end + 1;end = directory.indexOf(PATH_SUFFIX, start);// 检查所有目录是否创建完毕} while (end > start);}return true;} catch (Exception e) {e.printStackTrace();}return false;}/*** 下载文件** @param directory 服务端路径* @param file      本地文件路径*/public static boolean downloadFile(String directory, File file) {FileOutputStream fos = null;try {String[] listNames = ftpsClient.listNames(directory);for (String path : listNames) {if (path.endsWith(file.getName())) {if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}fos = new FileOutputStream(file);ftpsClient.retrieveFile(path, fos);log.info("文件下载成功,本地保存路径:{}", file.getAbsolutePath());return true;}}ftpsClient.logout();} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (ftpsClient.isConnected()) {try {ftpsClient.disconnect();} catch (IOException e) {e.printStackTrace();}}}return false;}
}
public class FTPTest {public static void main(String[] args) {String host = "192.168.0.1";int port = 10021;String userName = "ftp01";String passWord = "ftp2022";FtpsUtils.login(host, port, userName, passWord);String directory = new SimpleDateFormat("yyyyMMddHH").format(new Date());File file = new File("/Users/Documents/Dockerfile");FtpsUtils.uploadFile(directory, file);FtpsUtils.login(host, port, userName, passWord);File uploadFilePath = new File("/Users/Desktop/ftpDemo/Dockerfile");FtpsUtils.downloadFile(directory, uploadFilePath);}}

linux搭建ftps(vsftpd),java代码测试上传下载相关推荐

  1. Java代码实现上传视频获取视频某一帧作为截图封面(二)

    上一个文章讲了Java代码实现上传视频获取视频某一帧作为截图封面的一种方法,现在讲述第二种方法.为什么要在这里讲这种方法呢?第一.这种方法生成的图片占用的空间更小第二.这种方法可以获取很多信息 一.根 ...

  2. centos nfs java_CentOS下安装配置NFS并通过Java进行文件上传下载

    1:安装NFS (1)安装 yum install nfs-utils rpcbind (2)启动rpcbind服务 systemctl restart rpcbind.service 查看服务状态 ...

  3. java文件流 m.jb51.net_FasfDFS整合Java实现文件上传下载功能实例详解

    今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 org.c ...

  4. ubuntu下搭建FTP服务器并使用FileZilla上传下载

    ubuntu下搭建FTP服务器并使用FileZilla上传下载 为了让实验室同学在共享文件时更加方便,我们决定在实验室电脑上搭建一个FTP服务器,ubuntu系统版本为16.04,下面就是我的搭建流程 ...

  5. linux 安装上传文件,linux常用命令(二)文件上传下载及软件安装

    1.上传下载工具安装 (1)WINDOWS 到linux的文件上传及下载: windows下打开secureCRT,通过SSH连到⾄至远程linux主机: 上传下载工具安装命令:yum -y inst ...

  6. postman测试 上传下载文件

    postman测试 上传下载文件 1 测试上传文件 选择 Body 选择 form-data 参数 key 值 填写后 在后面下拉选择 file value 点击 Select Files 选择需要上 ...

  7. Postman测试上传/下载接口

    Postman测试上传/下载接口 1.Postman测试上传接口 2.Postman测试下载接口

  8. Java Web 文件上传下载

    文章目录 1文件上传概述 1.1文件上传的作用 1.2文件上传对页面的要求 1.3 比对文件上传表单和普通文本表单的区别 1.4 对普通文本表单的测试 1.5 文件上传对Servlet的要求 2 co ...

  9. linux使用命令行操作百度云上传下载文件

    linux命令行操作百度云 0. 背景 1. 安装 2. 登录百度云账号 3.上传文件 4.下载文件 5. 其它命令 6. python代码调用 0. 背景 很多时候我们只能通过ssh工具远程连接服务 ...

最新文章

  1. 简单解决AJAX在IE中的缓存问题
  2. Emlog简约好看的博客主题末遇
  3. 今晚博文视点大咖直播伴你读No.2:人工智能学习路线
  4. 使用 JSONModel
  5. Linux 审计日志记录,linux日志服务器审计客户端history记录
  6. 将转为时间戳php,php将时间转化为时间戳的方法
  7. float函数python作用_Python内置函数float()
  8. 复盘世预赛:国足5-0马尔代夫,吴曦成国足世预赛福星!三大前锋齐进球
  9. 解析力 (1 )MTF SFR
  10. word在试图打开文件时遇到错误,一种解决办法
  11. java tapestry_Java Web 框架 Tapestry
  12. 计算机领域nt=p,计算机考试范题-pwerpoint操作.doc
  13. 数据分析实战 | 银行 “信贷” 客户的可视化分析
  14. digitalpersona 开发(系统托盘,监听指纹扫描)
  15. \t\t12时辰养生
  16. Mysql - Mysql的建表建库
  17. nginx配置wss
  18. LINUX命令(1)-创建文件
  19. 团队管理之—— 架构设计:治理好系统复杂度才最务实
  20. python读取dicom序列_用原生Python解析DICOM文件

热门文章

  1. JavaEE体系架构
  2. 【linux】循序渐进学运维-基础篇-修复文件系统实战
  3. fmc接口定义_FMC接口说明
  4. HtmlUnit 使用范例
  5. 【JUC 并发编程】JUC 基本概念
  6. React基础(2)—— React函数式组件使用ref
  7. react-native 使用高德SDK取得位置信息
  8. js 判断变量是否为空
  9. Unity五子棋游戏设计 和简单AI实现(1)
  10. JESD79-4 第5章 片上终结电阻ODT(5.1-5.3)