Java使用 FTPClient方式 实现文件上传到服务器
**一、使用docker 安装 vsftpd**参考文档:https://blog.csdn.net/qq_41201816/article/details/83930133使用docker部署文件服务器:1.1 获取镜像#寻找vsftpd的镜像1.1.1.docker search vsftpd1.1.2.docker pull fauria/vsftpd1.2 创建vsft...
**
一、使用docker 安装 vsftpd**
参考文档:https://blog.csdn.net/qq_41201816/article/details/83930133
使用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 +端口+图片路径
更多推荐
所有评论(0)