一、上傳與下載
使用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/圖片名+后綴