Linux - SpringBoot文件上传、下载和访问
一、上传与下载
使用Java将文件、图片等通过ftp协议上传到linux中
1)Linux配置
在上传与下载之前,首先在linux中安装并配置FTP服务器,这里使用的是vsftpd。
① 安装 vsftpd
yum install -y vsftpd
② 设置 vsftpd 服务,开机自启
systemctl enable vsftpd
③ 启动 vsftpd 服务
systemctl start vsftpd.service
④ 在防火墙中开启21端口号(这里使用的是CentOs7以后的版本)
firewall-cmd --zone=public --add-port=21/tcp --permanent firewall-cmd --permanent --zone=public --add-service=ftp firewall-cmd --reload
⑤ 添加用户
#添加用户 [root@linuxtest ~]useradd ftpuser (用户名) #设置密码 [root@linuxtest ~]passwd ftpuser (密码)
注意:添加用户成功后,将在 /home 文件下多个 /ftpuser 文件,/home/ftpuser 是用户 ftpuser 登录后的默认路径,此用户上传文件,只能传到 /home/ftpuser 目录下。
⑥ 修改vsftp配置文件,禁止匿名登录
[root@linuxtest ~]vim /etc/vsftpd/vsftpd.conf
把:anonymous_enable=YES 改为: anonymous_enable=NO Esc---> :wq! 保存退出
2)导入依赖
<!-- FtpClient依赖包 -->
<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.3</version> </dependency>
3)上传
/** * Description: 向FTP服务器上传文件 * * @param host FTP服务器hostname * @param port FTP服务器端口 * @param username FTP登录账号 * @param password FTP登录密码 * @param filePath FTP服务器文件存放路径。 * @param filename 上传到FTP服务器上的文件名 * @param input 输入流 * @return 成功返回true,否则返回false */ public boolean uploadFile(String host, int port, String username, String password, String filePath, String filename, InputStream input) throws IOException { FTPClient ftpClient = new FTPClient(); try { int reply; logger.info("连接FTP服务器"); ftpClient.connect(host, port); logger.info("登录"); ftpClient.login(username, password); reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { logger.info("FTP连接失败"); ftpClient.disconnect(); return false; } ftpClient.setControlEncoding("utf-8");// 解决上传文件时文件名乱码 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置上传文件的类型为二进制类型 logger.info("切换到上传目录"); if (!ftpClient.changeWorkingDirectory(filePath)) { logger.info("目录不存在===>创建目录"); if (!ftpClient.makeDirectory(filePath)) { logger.error("目录创建失败"); return false; } else { logger.info("进入上传目录"); ftpClient.changeWorkingDirectory(filePath); } } ftpClient.setBufferSize(1024); // 设置缓存区 ftpClient.enterLocalPassiveMode();// 开通一个端口来传输数据 logger.info("上传文件"); if (!ftpClient.storeFile(filename, input)) { logger.info("上传失败"); return false; } ftpClient.logout(); } catch (IOException e) { logger.info("文件上传异常", e); e.printStackTrace(); } finally { logger.info("断开FTP连接"); ftpClient.disconnect(); } return true; }
4)下载
/** * Description: 从FTP服务器下载文件 * * @param host FTP服务器hostname * @param port FTP服务器端口 * @param username FTP登录账号 * @param password FTP登录密码 * @param remotePath FTP服务器上的相对路径 * @param fileName 要下载的文件名 * @param localPath 下载后保存到本地的路径 * @return */ public boolean downloadFile(String host, int port, String username, String password, String remotePath, String fileName, String localPath) throws IOException { FTPClient ftpClient = new FTPClient(); try { int reply; logger.info("连接FTP服务器"); ftpClient.connect(host, port); logger.info("登录"); ftpClient.login(username, password); reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { logger.info("FTP连接失败"); ftpClient.disconnect(); return false; } logger.info("进入FTP服务器下载目录"); if (!ftpClient.changeWorkingDirectory(remotePath)) { logger.info("目录不存在"); return false; } logger.info("匹配查找文件"); FTPFile[] fs = ftpClient.listFiles(); for (FTPFile ff : fs) { if (ff.getName().equals(fileName)) { logger.info("开始下载"); File localFile = new File(localPath + "/" + ff.getName()); OutputStream is = new FileOutputStream(localFile); ftpClient.retrieveFile(ff.getName(), is); is.close(); logger.info("下载完成"); } else { logger.info("找不到文件"); } } ftpClient.logout(); } catch (IOException e) { e.printStackTrace(); } finally { logger.info("断开FTP连接"); ftpClient.disconnect(); } return true; }
二、访问 Linux 服务器的文件(以图片为例)
编写服务端代码时,将前端传来的图片保存至服务器,并将路径保存到数据库中,当前端需要访问该图片时,不想利用二进制流传输,而是让前端利用 url 直接访问该图片。
如图,Linux 服务器 /root/ftproot/picture 路径下保存有图片,需要在浏览器中可以直接根据 url 访问到
此 Linux 服务器需要配置有 Tomcat
① 编辑 Tomcat 中的 Service.xml 文件
进入 Tomcat 的 conf 文件夹下编辑 server.xml 文件
vim server.xml
在文件的末尾部分加入
# docBase: 要访问图片所在的路径 # path: 虚拟路径 <Context docBase="/root/ftproot/picture" path="/picture" debug="0" reloadable="true" />
Esc -> :wq 保存退出
② 重启 Tomcat
# 关闭 ./shutdown.sh # 启动 ./startup.sh
③ 访问测试:http://ip:tomcat的端口/上文配置中的 path/图片名+后缀