JAVA通過FTP方式向遠程服務器或者客戶端上傳、下載文件,以及刪除FTP服務器上的文件


1、在目標服務器上搭建FTP服務器

搭建方式有多種大家可以自行選擇,例如使用Serv-U或者FTPServer.exe;這里我以FTPServer.exe為例搭建;在目標服務器(這里對應的IP是10.8.66.22)上運行FTPServer.exe並按照下圖設置:

 2、項目確保導入相應jar包:

apache的commons-net包:

maven項目導入下面的依賴即可:

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.6</version>
        </dependency>
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.6</version>
        </dependency>

3、編寫FTP工具類:

新建類名為FTPUtils的class,並將下面所有的代碼黏貼進去:

package com.springboot.cache.springbootcache.utiles;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

/**
 * FTP服務器工具類
 */
public class FTPUtils {

    /**
     * 上傳文件至FTP服務器
     *
     * @param url       服務器IP地址
     * @param port      服務器端口
     * @param userName  用戶登錄名
     * @param password  用戶登錄密碼
     * @param storePath 服務器文件存儲路徑
     * @param fileName  服務器文件存儲名稱
     * @param is        文件輸入流
     * @return <b>true</b>:上傳成功
     * <br/>
     * <b>false</b>:上傳失敗
     */
    public static boolean storeFile(String url, int port, String userName, String password, String storePath, String fileName, InputStream is) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            // 連接至服務器,端口默認為21時,可直接通過URL連接
            ftp.connect(url, port);
            // 登錄服務器
            ftp.login(userName, password);
            // 判斷返回碼是否合法
            if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
                // 不合法時斷開連接
                ftp.disconnect();
                // 結束程序
                return result;
            }
            // 判斷ftp目錄是否存在,如果不存在則創建目錄,包括創建多級目錄
            String s = "/" + storePath;
            String[] dirs = s.split("/");
            ftp.changeWorkingDirectory("/");
            //按順序檢查目錄是否存在,不存在則創建目錄
            for (int i = 1; dirs != null && i < dirs.length; i++) {
                if (!ftp.changeWorkingDirectory(dirs[i])) {
                    if (ftp.makeDirectory(dirs[i])) {
                        if (!ftp.changeWorkingDirectory(dirs[i])) {
                            return false;
                        }
                    } else {
                        return false;
                    }
                }
            }
            // 設置文件操作目錄
            ftp.changeWorkingDirectory(storePath);
            // 設置文件類型,二進制
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            // 設置緩沖區大小
            ftp.setBufferSize(3072);
            // 上傳文件
            result = ftp.storeFile(fileName, is);
            // 關閉輸入流
            is.close();
            // 登出服務器
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 判斷輸入流是否存在
                if (null != is) {
                    // 關閉輸入流
                    is.close();
                }
                // 判斷連接是否存在
                if (ftp.isConnected()) {
                    // 斷開連接
                    ftp.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 從FTP服務器下載文件至本地
     *
     * @param url        服務器IP地址
     * @param port       服務器端口
     * @param userName   用戶登錄名
     * @param password   用戶登錄密碼
     * @param remotePath 服務器文件存儲路徑
     * @param fileName   服務器文件存儲名稱
     * @param localPath  本地文件存儲路徑
     * @return <b>true</b>:下載成功
     * <br/>
     * <b>false</b>:下載失敗
     */
    public static boolean retrieveFile(String url, int port, String userName, String password, String remotePath, String fileName, String localPath) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        OutputStream os = null;
        try {
            // 連接至服務器,端口默認為21時,可直接通過URL連接
            ftp.connect(url, port);
            // 登錄服務器
            ftp.login(userName, password);
            // 判斷返回碼是否合法
            if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
                // 不合法時斷開連接
                ftp.disconnect();
                // 結束程序
                return result;
            }
            // 設置文件操作目錄
            ftp.changeWorkingDirectory(remotePath);
            // 設置文件類型,二進制
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            // 設置緩沖區大小
            ftp.setBufferSize(3072);
            // 設置字符編碼
            ftp.setControlEncoding("UTF-8");
            // 構造本地文件對象
            File localFile = new File(localPath + "/" + fileName);
            // 獲取文件操作目錄下所有文件名稱
            String[] remoteNames = ftp.listNames();
            // 循環比對文件名稱,判斷是否含有當前要下載的文件名
            for (String remoteName : remoteNames) {
                if (fileName.equals(remoteName)) {
                    result = true;
                }
            }
            // 文件名稱比對成功時,進入下載流程
            if (result) {
                // 構造文件輸出流
                os = new FileOutputStream(localFile);
                // 下載文件
                result = ftp.retrieveFile(fileName, os);
                // 關閉輸出流
                os.close();
            }
            // 登出服務器
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 判斷輸出流是否存在
                if (null != os) {
                    // 關閉輸出流
                    os.close();
                }
                // 判斷連接是否存在
                if (ftp.isConnected()) {
                    // 斷開連接
                    ftp.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 從FTP服務器刪除文件
     *
     * @param url        服務器IP地址
     * @param port       服務器端口
     * @param userName   用戶登錄名
     * @param password   用戶登錄密碼
     * @param remotePath 服務器文件存儲路徑
     * @param fileName   服務器文件存儲名稱
     * @return <b>true</b>:刪除成功
     * <br/>
     * <b>false</b>:刪除失敗
     */
    public static boolean deleteFile(String url, int port, String userName, String password, String remotePath, String fileName) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            // 連接至服務器,端口默認為21時,可直接通過URL連接
            ftp.connect(url, port);
            // 登錄服務器
            ftp.login(userName, password);
            // 判斷返回碼是否合法
            if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
                // 不合法時斷開連接
                ftp.disconnect();
                // 結束程序
                return result;
            }
            // 設置文件操作目錄
            ftp.changeWorkingDirectory(remotePath);
            // 設置文件類型,二進制
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            // 設置緩沖區大小
            ftp.setBufferSize(3072);
            // 設置字符編碼
            ftp.setControlEncoding("UTF-8");
            // 獲取文件操作目錄下所有文件名稱
            String[] remoteNames = ftp.listNames();
            // 循環比對文件名稱,判斷是否含有當前要下載的文件名
            for (String remoteName : remoteNames) {
                if (fileName.equals(remoteName)) {
                    result = true;
                }
            }
            // 文件名稱比對成功時,進入刪除流程
            if (result) {
                // 刪除文件
                result = ftp.deleteFile(fileName);
            }
            // 登出服務器
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 判斷連接是否存在
                if (ftp.isConnected()) {
                    // 斷開連接
                    ftp.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    public static void main(String[] args) throws FileNotFoundException {
        try {
            FileInputStream fis = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\太行后台socket發送工具1.txt"));
            System.out.println(storeFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", UUID.randomUUID() + ".txt", fis));

//            File file = new File("D:\\upload\\20191217070411_start.txt");
//            InputStream is = new FileInputStream(file);
//            System.out.println(storeFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", "2.txt", is));
//            System.out.println(retrieveFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", "2.txt", "D:\\upload"));
//            System.out.println(deleteFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", "2.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

}

上面的工具類定義了三個方法,分別支持上傳文件,下載文件,刪除FTP服務器上的文件,可根據需求自行調用;


免責聲明!

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



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