**
一、使用docker 安装 vsftpd**
参考文档:
使用docker部署文件服务器:
1.1 获取镜像
#寻找vsftpd的镜像
1.1.1.docker search vsftpd
1.1.2.docker pull fauria/vsftpd
1.2 创建vsftpd容器
docker run -d -p 21:21 -p 20:20 -p 21100-21110:21100-21110 -v /Ftpfile:/home/vsftpd -e FTP_USER=连接用户名 -e FTP_PASS=连接密码 -e PASV_ADDRESS=你的ip -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 --name vsftpd --restart=always fauria/vsftpd
注释说明:
#FTP_USER : 设置远程连接的账户名
#FTP_PASS : 远程连接的密码
#-p进行端口绑定映射
-v进行文件目录的映射 FTP_UESR 和FTP_PASS如果设定了会在container里面的
#/etc/vsftpd/virtual_users.txt
#PASV_MIN_PORT和PASV_MAX_PORT映射的是被动模式下端口使用范围
#PASV_ADDRESS指的的宿主机地址
1.3 修改配置
1、我们先进入container里面
docker exec -i -t vsftpd bash
2、修改并生成虚拟用户模式下的用户db文件
vi /etc/vsftpd/virtual_users.txt
#编辑配置文件写入用户跟密码
3、假如我们添加了user用户
mkdir /home/vsftpd/user #建立新用户文件夹
/usr/bin/db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db
#把登录的验证信息写入数据库
1.4 重启,使用Xftp验证连接
先退出容器 :Ctrl +d
重启vsftpd 服务: docker restart vsftpd
二、Java 实现文件上传**
2.1 引入maven 依赖
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
2.2 编写文件上传方法
/**
- 保存图片到文件服务器
- @param file
- @return
*/
public static String uploadImageToFileServer(MultipartFile file) {
if(file.getSize() > EViewConstant.FtpFileServer.SIZE){
log.info("上传的文件大小超过10mb");
return "";
}
InputStream inputStream = null;
String fileName = file.getOriginalFilename();
//获取文件的格式
String fileType = fileName.substring(fileName.indexOf(".")).toLowerCase().trim();
//生成一个随机的文件名,避免重名覆盖
String randomString= UUID.randomUUID().toString().replaceAll("-","");
String fileNewName = randomString+fileType;
FTPClient ftpClient = new FTPClient();
try{
//连接到FTP 服务器
ftpClient.connect(EViewConstant.FtpFileServer.HOST, EViewConstant.FtpFileServer.PORT);
ftpClient.login(EViewConstant.FtpFileServer.USER_NAME,EViewConstant.FtpFileServer.PASSWORD);
//ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
ftpClient.changeWorkingDirectory("/Ftpfile/eiot");
//ftp上传文件是以文本形式传输的,所以多媒体文件会失真,需要转为二进制形式传输
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
log.info("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
log.info("FTP连接成功");
}
long start = System.currentTimeMillis();
inputStream = file.getInputStream();
//转码后可以文件名可以为中文ftpClient.storeFile(new String(fileNewName.getBytes("GBK"), "iso-8859-1"), inputStream);
// ftpClient.enterLocalPassiveMode();
boolean fig = ftpClient.storeFile(fileNewName, inputStream);
if(fig){
long end = System.currentTimeMillis();
log.info(String.format("文件:%s上传成功,耗时:%d毫秒",fileNewName,(end-start)));
}else {
log.info("上传失败");
return "";
}
}catch (IOException io){
io.printStackTrace();
log.error("保存图片到文件服务器ERROR:"+io.getMessage());
return "";
}finally {
//关闭资源
try {
if(null != inputStream){
inputStream.close();
}
//退出
ftpClient.logout();
//断开连接
ftpClient.disconnect();
}catch (IOException io){
log.error("保存图片到文件服务器关闭资源ERROR"+io.getMessage());
}
}
return EViewConstant.FtpFileServer.IMAGE_URL+fileNewName;
}
上传成功
三、图片展示
3.1 文件展示需要配置nginx 的配置文件
/etc/nginx/conf.d
vi default.conf
增加一个server配置
#图片配置
server{
listen 90;
server_name localhost;
location ~ .(gif|jpg|jpeg|png|bmp|swf)$ {
root /Ftpfile;
proxy_temp_path /Ftpfile;
}
}
设置nginx 访问权限(修改为root):
浏览器地址直接输入:ip +端口+图片路径