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/圖片名+后綴


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM