- A+
所属分类:Docker
一般在开发企业应用时,都会涉及到文件的上传下载等功能,那么就需要一个文件存储服务器,这里推荐使用ftp服务,下面使用docker形式安装ftp服务。
查询可使用的ftp镜像
docker search vsftpd
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
fauria/vsftpd vsftpd Docker image based on Centos 7. Sup... 71 [OK]
panubo/vsftpd vsftpd - Secure, fast FTP server 23 [OK]
vimagick/vsftpd 12 [OK]
helder/vsftpd 11 [OK]
million12/vsftpd VSFTPD Server in a Docker 7 [OK]
odiobill/vsftpd Very light vsftpd installation based on De... 7 [OK]
emilybache/vsftpd-server 5 [OK]
此处,选择fauria/vsftpd该镜像进行下载。
下载ftp镜像
docker pull fauria/vsftpd
Using default tag: latest
latest: Pulling from fauria/vsftpd
8ba884070f61: Pull complete
bf4d64e5b4a9: Pull complete
67f77917b011: Pull complete
5267357c06a7: Pull complete
97b74f38df2a: Pull complete
7bf19ad281b9: Pull complete
c9f5ecf027e4: Pull complete
d4952895856c: Pull complete
a6bc2c6baa32: Pull complete
7aad560b8704: Pull complete
Digest: sha256:1861d4fb9c72002e4046d0688e802c6b25535c94c051e8473e48bd5b27e14502
Status: Downloaded newer image for fauria/vsftpd:latest
查看ftp镜像
docker images
fauria/vsftpd latest 4900fef1a627 4 months ago 260.9 MB
启动ftp镜像
//run 启动镜像
//-d 设置镜像
//-p 设置端口号
//-v 设置ftp文件挂载点 /Users/localhost/Documents/soft:/home/vsftpd 冒号前面为宿主机地址,后面为映射ftp上的地址
//-e FTP_USER=admin -e FTP_PASS=admin 设置ftp用户名密码
//-e PASV_ADDRESS=127.0.0.1 宿主机地址
//-e PASV_MIN_PORT=21100 给客服端提供下载服务随机端口号范围,默认 21100-21110,与前面的 docker 端口映射设置成一样。
docker run -d -p 21:21 -p 20:20 -p 21100-21110:21100-21110 -v /Users/localhost/Documents/soft:/home/vsftpd -e FTP_USER=admin -e FTP_PASS=admin -e PASV_ADDRESS=127.0.0.1 -e PASV_MIN_PORT=21100
-e PASV_MAX_PORT=21110 --name vsftpd --restart=always fauria/vsftpd
查看ftp容器
docker ps
83c2ec404037 fauria/vsftpd "/usr/sbin/run-vsftpd" 13 minutes ago Up 13 minutes 0.0.0.0:20-21->20-21/tcp, 0.0.0.0:21100-21110->21100-21110/tcp vsftpd
进入ftp容器中
//通过exec进入ftp容器中,可以看到/home/vsftpd目录
docekr exec -i -t 83c2 bash
[root@83c2ec404037 vsftpd]# pwd
/home/vsftpd
登录ftp服务器
安装完之后,可以通过浏览器输出ftp://127.0.0.1 路径进行访问文件服务器,如图:
上述就是docker安装ftp服务的步骤,可参考。
安装完成后,就可以使用程序进行连接ftp服务器进行操作了,推荐使用common-net包下的ftpClient
使用之前需要添加maven依赖,如下
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
引入依赖后,编写ftp工具类,对文件进行操作。可依据以下范例:
package com.aliyun.police.brain.eventperceptionmodel.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.*;
import java.net.SocketException;
/**
* @Description ftp工具类
*/
@Slf4j
public class FtpTools {
//FTP服务器IP地址
public final static String FTP_HOST = "127.0.0.1";
//FTP服务器端口
public final static int FTP_PORT = 21;
//FTP服务器用户名
public final static String FTP_USER = "admin";
//密码
public final static String FTP_PASSWORD = "admin";
/**
* Description: 向FTP服务器上传文件
*
* @param path FTP服务器保存目录
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false *
* @Version 1.0
*/
public static boolean uploadFile(String path, String filename, InputStream input) {
boolean success = false;
FTPClient ftp = new FTPClient();
ftp.setControlEncoding("GBK");
try {
int reply;
// 连接FTP服务器
ftp.connect(FTP_HOST, FTP_PORT);
// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
// 登录
ftp.login(FTP_USER, FTP_PASSWORD);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.makeDirectory(path);
ftp.changeWorkingDirectory(path);
ftp.storeFile(filename, input);
input.close();
ftp.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
/**
* 从服务器的FTP路径下读取文件
*
* @param ftpPath
* @return
*/
public static InputStream readFileFromFTP(String ftpPath, String fileName) {
StringBuffer resultBuffer = new StringBuffer();
InputStream in = null;
FTPClient ftpClient = null;
log.info("开始从绝对路径:" + ftpPath + "读取文件!");
try {
ftpClient = FtpTools.getFTPClient(FTP_HOST, FTP_PORT, FTP_USER, FTP_PASSWORD);
ftpClient.setControlEncoding("UTF-8"); // 中文支持
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
ftpClient.changeWorkingDirectory(ftpPath);
in = ftpClient.retrieveFileStream(fileName);
} catch (FileNotFoundException e) {
log.error("没有找到" + ftpPath + "文件");
e.printStackTrace();
} catch (SocketException e) {
log.error("连接FTP失败!");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
log.error("文件读取错误!");
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException ioe) {
}
}
}
return in;
}
/**
* 获取FTPClient对象
*
* @param ftpHost FTP主机服务器
* @param ftpPassword FTP 登录密码
* @param ftpUserName FTP登录用户名
* @param ftpPort FTP端口 默认为21
* @return
*/
public static FTPClient getFTPClient(String ftpHost, int ftpPort,
String ftpUserName, String ftpPassword) {
FTPClient ftpClient = null;
try {
ftpClient = new FTPClient();
ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
log.info("未连接到FTP,用户名或密码错误!");
ftpClient.disconnect();
} else {
log.info("FTP连接成功!");
}
} catch (SocketException e) {
e.printStackTrace();
log.info("FTP的IP地址可能错误,请正确配置。");
} catch (IOException e) {
e.printStackTrace();
log.info("FTP的端口错误,请正确配置。");
}
return ftpClient;
}
/**
* 删除ftp上的文件
*
* @param ftpFileName
* @return true || false
*/
public static boolean removeFile(String ftpFileName) {
boolean flag = false;
log.info("待删除文件:{}", ftpFileName);
FTPClient ftpClient = null;
try {
ftpClient = FtpTools.getFTPClient(FTP_HOST, FTP_PORT, FTP_USER, FTP_PASSWORD);
ftpFileName = new String(ftpFileName.getBytes("GBK"), "iso-8859-1");
flag = ftpClient.deleteFile(ftpFileName);
log.info("删除文件:{}"
, flag ? "成功" : "失败");
return flag;
} catch (IOException e) {
log.error("删除文件失败!" + e);
return false;
}
}
}
- 我的微信
- 加好友一起交流!
-
- 微信公众号
- 关注公众号获取分享资源!
-