Heim > Java > javaLernprogramm > Hauptteil

So lesen und übertragen Sie FTP-Dateien in Java

PHPz
Freigeben: 2023-05-19 14:46:21
nach vorne
1837 Leute haben es durchsucht

    1. Anforderungen

    FTP dient als Dateiserver und der Dienstanbieter stellt die Remote-Verbindungsadresse und den Verbindungsport bereit und Kontonummer und andere Informationen.
    Client-Verbindung kann basierend auf den oben genannten Informationen hergestellt werden, und dann können Dateilesen, Datei-Upload und andere Vorgänge auf der hergestellten Verbindung ausgeführt werden

    2 Abhängigkeit

    <!-- FTP相关操作的依赖 -->
    <dependency>
        <groupId>commons-net</groupId>
        <artifactId>commons-net</artifactId>
        <version>3.9.0</version>
    </dependency>
    <!-- IO工具类的依赖 -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.11.0</version>
    </dependency>
    <!-- lombok依赖 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.26</version>
        <scope>provided</scope>
    </dependency>
    Nach dem Login kopieren
    #🎜 🎜#3 .Schlüsselquellcode

    3.0 Konfigurationsinformationen

    ftp:
      config:
        host: ${env.ftp.config.host:10.1.1.1}
        port: ${env.ftp.config.port:12345}
        username: ${env.ftp.config.username:ftpUsername}
        password: ${env.ftp.config.password:ftpPwd}
        remote-dir-path: ${env.ftp.config.remote-dir-path:/}
    Nach dem Login kopieren
    /**
     * @author: Vainycos
     * @description ftp配置信息
     * @date: 2023/4/17 15:16
     */
    @Data
    @Component
    @ConfigurationProperties("ftp.config")
    public class FtpConfig {
        private String host;
        private int port;
        private String username;
        private String password;
        /** 初始读取根目录,当前默认/ */
        private String remoteDirPath;
    }
    Nach dem Login kopieren

    3.1 Client abrufen

    /**
    * 获取ftp客户端
    * @return
    */
    public FTPClient getFtpClient(){
        try {
            FTPClient ftpClient = new FTPClient();
            ftpClient.connect(ftpConfig.getHost() ,ftpConfig.getPort());
            // 10分钟连接时间
            ftpClient.setConnectTimeout(600000);
            ftpClient.setDefaultTimeout(600000);
            ftpClient.login(ftpConfig.getUsername() ,ftpConfig.getPassword());
            // login后设置传输的模式
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            // login后设置被动模式
            ftpClient.enterLocalPassiveMode();
            // login后设置编码
            String LOCAL_CHARSET = "GBK";
            // 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
                LOCAL_CHARSET = "UTF-8";
            }
            ftpClient.setControlEncoding(LOCAL_CHARSET);
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                log.error("未连接到FTP,用户名或密码错误!");
                ftpClient.disconnect();
            } else {
                log.info("FTP连接成功!");
            }
            // 切换从某个根目录下开始扫描
            ftpClient.changeWorkingDirectory(ftpConfig.getRemoteDirPath());
            return ftpClient;
        }catch (IOException e) {
            log.error("ftp建立连接异常->{}", e);
        }
        return null;
    }
    Nach dem Login kopieren

    3.2 FTP-Datei abrufen

    /**
    * 获取对应目录下的第一级目录文件
    * @param ftpClient client
    * @throws IOException
    */
    public void getFtpFirstDirectoryFiles(FTPClient ftpClient) throws IOException {
        log.info("ftpclient当前工作目录->{}", ftpClient.printWorkingDirectory());
        if (ftpClient != null) {
            FTPFile[] files = ftpClient.listFiles();
            for (FTPFile file : files) {
                String fileName = file.getName();
                if (file.isDirectory()){
                    // 每次从根目录下查找第一级目录
                    String firstDirectory = ftpConfig.getRemoteDirPath() + "/" + fileName;
                    ftpClient.changeWorkingDirectory(firstDirectory);
                    log.info("当前目录->{}, 开始扫描录音文件", firstDirectory);
                    // 切换目录后直接遍历第一级的文件,不递归第二级目录
                    dealFile(ftpClient);
                    log.info("{}->目录扫描结束", firstDirectory);
                }
            }
        }
    }
    /**
     * 处理目录下的文件
     * @param ftpClient
     * @throws IOException
     */
    public void dealFile(FTPClient ftpClient) throws IOException {
        FTPFile[] files = ftpClient.listFiles();
            for (FTPFile file : files) {
                String fileName = file.getName();
                if (file.isDirectory()) {
                    log.info("{}->为目录,跳过", fileName);
                    continue;
                }
                String rootWorkingDirectory = ftpClient.printWorkingDirectory();
                log.info("获取到文件->{}, 开始获取ftp文件流, ftpclient工作目录->{}", fileName, ftpClient.printWorkingDirectory());
                // 开始获取ftp文件流
                InputStream inputStream = ftpClient.retrieveFileStream(new String(fileName.getBytes("UTF-8"), FTP.DEFAULT_CONTROL_ENCODING));
                if (inputStream == null){
                    log.error("文件不存在->{}", fileName);
                    return;
                }
                byte[] data = IOUtils.toByteArray(inputStream);
                inputStream.close();
                // 关键代码,如果不执行该代码,后续的ftpClient操作将会不生效
                ftpClient.completePendingCommand();
                // 省略...获取到了inputStream 文件流进行后续处理
               }
    }
    Nach dem Login kopieren
    # 🎜 🎜#3.3 FTP-Dienstverbindung schließen

    /**
     * 关闭FTP服务连接
     * @param ftpClient
     */
    public void disConnection(FTPClient ftpClient) {
        try{
            if(ftpClient.isConnected()){
                ftpClient.disconnect();
            }
        }catch(IOException e) {
            log.error("ftpClient.disconnect失败->{}", e);
        }
    }
    Nach dem Login kopieren

    Das obige ist der detaillierte Inhalt vonSo lesen und übertragen Sie FTP-Dateien in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:yisu.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage