springBoot 实现ftp上传与下载

一、添加依赖

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

二、添加配置

#ftp
#ftp地址-ftp请求。ftp://192.168.3.127:22
ftp.host=192.168.3.127
#ftp端口号
ftp.port=22
#ftp请求的用户名
ftp.username=ftp2
#ftp请求的密码
ftp.password=123456
#ftp请求读取写入的文件路径
ftp.filepath=/
#http请求路径。http://192.168.3.127:82
ftp.web.host=192.168.3.127
ftp.web.port=82

三、创建实体类

/**
 * @program: yxc
 * @description: application配置文件实体类
 * @author: maque
 * @create: 2019-05-06 14:51
 */
@Component
public class ApplicationEntity {

    /**
     * ftp站点
     */
    @Value("${ftp.host}")
    private String ftpHost;
    /**
     * ftp端口号
     */
    @Value("${ftp.port}")
    private int ftpPort;
    /**
     * ftp访问用户名
     */
    @Value("${ftp.username}")
    private String ftpUsername;
    /**
     * ftp访问密码
     */
    @Value("${ftp.password}")
    private String ftpPassword;
    /**
     * ftp访问文件路径
     */
    @Value("${ftp.filepath}")
    private String ftpFilepath;
    /**
     * ftp提供的http方式访问地址
     */
    @Value("${ftp.web.host}")
    private String ftpWebHost;
    /**
     * ftp提供的http方式访问的端口号
     */
    @Value("${ftp.web.port}")
    private String ftpWebPort;

    public String getFtpHost() {
        return ftpHost;
    }

    public void setFtpHost(String ftpHost) {
        this.ftpHost = ftpHost;
    }

    public int getFtpPort() {
        return ftpPort;
    }

    public void setFtpPort(int ftpPort) {
        this.ftpPort = ftpPort;
    }

    public String getFtpUsername() {
        return ftpUsername;
    }

    public void setFtpUsername(String ftpUsername) {
        this.ftpUsername = ftpUsername;
    }

    public String getFtpPassword() {
        return ftpPassword;
    }

    public void setFtpPassword(String ftpPassword) {
        this.ftpPassword = ftpPassword;
    }

    public String getFtpFilepath() {
        return ftpFilepath;
    }

    public void setFtpFilepath(String ftpFilepath) {
        this.ftpFilepath = ftpFilepath;
    }

    public String getFtpWebHost() {
        return ftpWebHost;
    }

    public void setFtpWebHost(String ftpWebHost) {
        this.ftpWebHost = ftpWebHost;
    }

    public String getFtpWebPort() {
        return ftpWebPort;
    }

    public void setFtpWebPort(String ftpWebPort) {
        this.ftpWebPort = ftpWebPort;
    }
}

四、想容器中注入 FTPClient对象

 

@Bean
    public FTPClient ftpClient(){
//        BeansEntity beansEntity =new BeansEntity();
        FTPClient ftpClient = new FTPClient();
        ftpClient.setConnectTimeout(1000*30);//设置连接超时时间
        ftpClient.setControlEncoding("utf-8");//设置ftp字符集
//        ftpClient.enterLocalPassiveMode();//设置被动模式,文件传输端口设置
        try {
//            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);//设置文件传输模式为二进制,可以保证传输的内容不会被改变
//            ftpClient.connect(beansEntity.getIp()+":"+beansEntity.getPort());
            ftpClient.setDefaultPort(applicationEntity.getFtpPort());
            ftpClient.connect(applicationEntity.getFtpHost(),applicationEntity.getFtpPort());
            ftpClient.login(applicationEntity.getFtpUsername(),applicationEntity.getFtpPassword());
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)){
                ftpClient.disconnect();
                logger.error("未连接到FTP,用户名或密码错误!");
                return null;
            }else {
                logger.info("FTP连接成功!");
                return ftpClient;
            }
        } catch (SocketException socketException) {
            logger.error("FTP的IP地址可能错误,请正确配置!");
            return null;
        } catch (IOException ioException) {
            ioException.printStackTrace();
            logger.error("FTP的端口错误,请正确配置!");
            return null;
        }
    }

五、ftp服务接口实现

public interface FTPClientService {
    
    public String readFileToBase64(String remoteFileName,String remoteDir);
    
    public void download(String remoteFileName,String localFileName,String remoteDir);
    
    public boolean uploadFile(InputStream inputStream, String originName, String remoteDir);
}
/**
 * @program: yxc
 * @description: ftp服务接口
 * @author: maque
 * @create: 2019-05-06 13:39
 */
@Service("ftpClienService'")
public class FTPClientServiceImpl implements FTPClientService {
    private Logger LOGGER = LoggerFactory.getLogger(getClass());

    @Autowired
    private FTPClient ftpClient;

    @Override
    public String readFileToBase64(String remoteFileName,String remoteDir) {
        if (ftpClient == null){
            return null;
        }

        String base64 = "";
        InputStream inputStream = null;

        try {
            ftpClient.changeWorkingDirectory(remoteDir);
            FTPFile[] ftpFiles = ftpClient.listFiles(remoteDir);
            Boolean flag = false;
            //遍历当前目录下的文件,判断要读取的文件是否在当前目录下
            for (FTPFile ftpFile:ftpFiles){
                if (ftpFile.getName().equals(remoteFileName)){
                    flag = true;
                }
            }

            if (!flag){
                LOGGER.error("directory:{}下没有 {}",remoteDir,remoteFileName);
                return null;
            }
            //获取待读文件输入流
            inputStream = ftpClient.retrieveFileStream(remoteDir+remoteFileName);

            //inputStream.available() 获取返回在不阻塞的情况下能读取的字节数,正常情况是文件的大小
            byte[] bytes = new byte[inputStream.available()];

            inputStream.read(bytes);//将文件数据读到字节数组中
            BASE64Encoder base64Encoder = new BASE64Encoder();
            base64 = base64Encoder.encode(bytes);//将字节数组转成base64字符串
            LOGGER.info("read file {} success",remoteFileName);
            ftpClient.logout();
        } catch (IOException e) {
            LOGGER.error("read file fail ----->>>{}",e.getCause());
            return null;
        }finally {
            if (ftpClient.isConnected()){
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    LOGGER.error("disconnect fail ------->>>{}",e.getCause());
                }
            }

            if (inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    LOGGER.error("inputStream close fail -------- {}",e.getCause());
                }
            }

        }

        return base64;
    }

    @Override
    public void download(String remoteFileName, String localFileName,String remoteDir) {

    }

    /**
     *  上传文件
     * @param inputStream 待上传文件的输入流
     * @param originName 文件保存时的名字
     * @param remoteDir 文件要存放的目录
     */
    @Override
    public boolean uploadFile(InputStream inputStream, String originName, String remoteDir){
        if (ftpClient == null){
            return false;
        }

        try {
            ftpClient.changeWorkingDirectory(remoteDir);//进入到文件保存的目录
            Boolean isSuccess = ftpClient.storeFile(originName,inputStream);//保存文件
//            if (!isSuccess){
//                throw new BusinessException(ResponseCode.UPLOAD_FILE_FAIL_CODE,originName+"---》上传失败!");
//            }
            LOGGER.info("{}---》上传成功!",originName);
            ftpClient.logout();
            return true;
        } catch (IOException e) {
            LOGGER.error("{}---》上传失败!",originName);
//            throw new BusinessException(ResponseCode.UPLOAD_FILE_FAIL_CODE,originName+"上传失败!");
            return false;
        }finally {
            if (ftpClient.isConnected()){
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    LOGGER.error("disconnect fail ------->>>{}",e.getCause());
                }
            }
        }
    }
}

六、测试

/**
 * @program: yxc
 * @description: 测试ftp
 * @author: maque
 * @create: 2019-05-06 13:54
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestFTP {

    @Autowired
    private FTPClientService ftpClientService;
    @Test
    public void test1(){
        try {
            InputStream inputStream = new FileInputStream(new File("E:\\temp\\toPDF\\index.jpg"));
            ftpClientService.uploadFile(inputStream,"000.jpg","/2018/");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

springBoot 实现ftp上传与下载