docker安装ftp文件服务器及ftp工具类的使用教程版

  • 13

docker安装ftp文件服务器及ftp工具类的使用

一般在开发企业应用时,都会涉及到文件的上传下载等功能,那么就需要一个文件存储服务器,这里推荐使用ftp服务,下面使用docker形式安装ftp服务。

查询可使用的ftp镜像
docker search vsftpd
NAME                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
fauria/vsftpd                 vsftpd Docker image based on Centos 7. Sup...   71                   [OK]
panubo/vsftpd                 vsftpd - Secure, fast FTP server                23                   [OK]
vimagick/vsftpd                                                               12                   [OK]
helder/vsftpd                                                                 11                   [OK]
million12/vsftpd              VSFTPD Server in a Docker                       7                    [OK]
odiobill/vsftpd               Very light vsftpd installation based on De...   7                    [OK]
emilybache/vsftpd-server                                                      5                    [OK]

此处,选择fauria/vsftpd该镜像进行下载。

下载ftp镜像
docker pull fauria/vsftpd
Using default tag: latest
latest: Pulling from fauria/vsftpd
8ba884070f61: Pull complete 
bf4d64e5b4a9: Pull complete 
67f77917b011: Pull complete 
5267357c06a7: Pull complete 
97b74f38df2a: Pull complete 
7bf19ad281b9: Pull complete 
c9f5ecf027e4: Pull complete 
d4952895856c: Pull complete 
a6bc2c6baa32: Pull complete 
7aad560b8704: Pull complete 
Digest: sha256:1861d4fb9c72002e4046d0688e802c6b25535c94c051e8473e48bd5b27e14502
Status: Downloaded newer image for fauria/vsftpd:latest
查看ftp镜像
docker images
fauria/vsftpd                                latest              4900fef1a627        4 months ago        260.9 MB
启动ftp镜像
//run 启动镜像
//-d 设置镜像
//-p 设置端口号
//-v 设置ftp文件挂载点 /Users/localhost/Documents/soft:/home/vsftpd 冒号前面为宿主机地址,后面为映射ftp上的地址
//-e FTP_USER=admin -e FTP_PASS=admin 设置ftp用户名密码
//-e PASV_ADDRESS=127.0.0.1 宿主机地址
//-e PASV_MIN_PORT=21100 给客服端提供下载服务随机端口号范围,默认 21100-21110,与前面的 docker 端口映射设置成一样。
docker run -d -p 21:21 -p 20:20 -p 21100-21110:21100-21110 -v /Users/localhost/Documents/soft:/home/vsftpd -e FTP_USER=admin -e FTP_PASS=admin -e PASV_ADDRESS=127.0.0.1 -e PASV_MIN_PORT=21100
-e PASV_MAX_PORT=21110 --name vsftpd --restart=always fauria/vsftpd
查看ftp容器
docker ps
83c2ec404037        fauria/vsftpd       "/usr/sbin/run-vsftpd"   13 minutes ago      Up 13 minutes       0.0.0.0:20-21->20-21/tcp, 0.0.0.0:21100-21110->21100-21110/tcp   vsftpd
进入ftp容器中
//通过exec进入ftp容器中,可以看到/home/vsftpd目录
docekr exec -i -t 83c2 bash
[root@83c2ec404037 vsftpd]# pwd
/home/vsftpd
登录ftp服务器

安装完之后,可以通过浏览器输出ftp://127.0.0.1 路径进行访问文件服务器,如图:
docker安装ftp文件服务器及ftp工具类的使用

上述就是docker安装ftp服务的步骤,可参考。

安装完成后,就可以使用程序进行连接ftp服务器进行操作了,推荐使用common-net包下的ftpClient
使用之前需要添加maven依赖,如下

        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.6</version>
        </dependency>

引入依赖后,编写ftp工具类,对文件进行操作。可依据以下范例:

package com.aliyun.police.brain.eventperceptionmodel.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.*;
import java.net.SocketException;

/**
 * @Description ftp工具类
 */
@Slf4j
public class FtpTools {
    //FTP服务器IP地址
    public final static String FTP_HOST = "127.0.0.1";

    //FTP服务器端口
    public final static int FTP_PORT = 21;

    //FTP服务器用户名
    public final static String FTP_USER = "admin";

    //密码
    public final static String FTP_PASSWORD = "admin";

    /**
     * Description: 向FTP服务器上传文件
     *
     * @param path     FTP服务器保存目录
     * @param filename 上传到FTP服务器上的文件名
     * @param input    输入流
     * @return 成功返回true,否则返回false *
     * @Version 1.0
     */
    public static boolean uploadFile(String path, String filename, InputStream input) {
        boolean success = false;
        FTPClient ftp = new FTPClient();
        ftp.setControlEncoding("GBK");
        try {
            int reply;
            // 连接FTP服务器
            ftp.connect(FTP_HOST, FTP_PORT);
            // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            // 登录
            ftp.login(FTP_USER, FTP_PASSWORD);
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return success;
            }
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftp.makeDirectory(path);
            ftp.changeWorkingDirectory(path);
            ftp.storeFile(filename, input);
            input.close();
            ftp.logout();
            success = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;
    }

    /**
     * 从服务器的FTP路径下读取文件
     *
     * @param ftpPath
     * @return
     */
    public static InputStream readFileFromFTP(String ftpPath, String fileName) {
        StringBuffer resultBuffer = new StringBuffer();
        InputStream in = null;
        FTPClient ftpClient = null;
        log.info("开始从绝对路径:" + ftpPath + "读取文件!");
        try {
            ftpClient = FtpTools.getFTPClient(FTP_HOST, FTP_PORT, FTP_USER, FTP_PASSWORD);
            ftpClient.setControlEncoding("UTF-8"); // 中文支持
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.enterLocalPassiveMode();
            ftpClient.changeWorkingDirectory(ftpPath);
            in = ftpClient.retrieveFileStream(fileName);
        } catch (FileNotFoundException e) {
            log.error("没有找到" + ftpPath + "文件");
            e.printStackTrace();
        } catch (SocketException e) {
            log.error("连接FTP失败!");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
            log.error("文件读取错误!");
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return in;
    }

    /**
     * 获取FTPClient对象
     *
     * @param ftpHost     FTP主机服务器
     * @param ftpPassword FTP 登录密码
     * @param ftpUserName FTP登录用户名
     * @param ftpPort     FTP端口 默认为21
     * @return
     */
    public static FTPClient getFTPClient(String ftpHost, int ftpPort,
                                         String ftpUserName, String ftpPassword) {
        FTPClient ftpClient = null;
        try {
            ftpClient = new FTPClient();
            ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
            ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                log.info("未连接到FTP,用户名或密码错误!");
                ftpClient.disconnect();
            } else {
                log.info("FTP连接成功!");
            }
        } catch (SocketException e) {
            e.printStackTrace();
            log.info("FTP的IP地址可能错误,请正确配置。");
        } catch (IOException e) {
            e.printStackTrace();
            log.info("FTP的端口错误,请正确配置。");
        }
        return ftpClient;
    }
      /**
     * 删除ftp上的文件
     *
     * @param ftpFileName
     * @return true || false
     */
    public static boolean removeFile(String ftpFileName) {
        boolean flag = false;
        log.info("待删除文件:{}", ftpFileName);
        FTPClient ftpClient = null;
        try {
            ftpClient = FtpTools.getFTPClient(FTP_HOST, FTP_PORT, FTP_USER, FTP_PASSWORD);
            ftpFileName = new String(ftpFileName.getBytes("GBK"), "iso-8859-1");
            flag = ftpClient.deleteFile(ftpFileName);
            log.info("删除文件:{}"
                , flag ? "成功" : "失败");
            return flag;
        } catch (IOException e) {
            log.error("删除文件失败!" + e);
            return false;
        }
    }
}


发表评论