Java怎么读取传输FTP文件

服务器   发布日期:前天 08:54   浏览次数:203

这篇文章主要介绍了Java怎么读取传输FTP文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么读取传输FTP文件文章都会有所收获,下面我们一起来看看吧。

    一.需求

    FTP作为文件服务器,由提供服务方提供远程连接地址,连接端口,账号,密码等信息。
    根据以上信息可以建立客户端连接,随后对于建立好的连接可进行文件读取,文件上传等操作

    二.依赖

    1. <!-- FTP相关操作的依赖 -->
    2. <dependency>
    3. <groupId>commons-net</groupId>
    4. <artifactId>commons-net</artifactId>
    5. <version>3.9.0</version>
    6. </dependency>
    7. <!-- IO工具类的依赖 -->
    8. <dependency>
    9. <groupId>commons-io</groupId>
    10. <artifactId>commons-io</artifactId>
    11. <version>2.11.0</version>
    12. </dependency>
    13. <!-- lombok依赖 -->
    14. <dependency>
    15. <groupId>org.projectlombok</groupId>
    16. <artifactId>lombok</artifactId>
    17. <version>1.18.26</version>
    18. <scope>provided</scope>
    19. </dependency>

    三.关键源码

    3.0 配置信息

    1. ftp:
    2. config:
    3. host: ${env.ftp.config.host:10.1.1.1}
    4. port: ${env.ftp.config.port:12345}
    5. username: ${env.ftp.config.username:ftpUsername}
    6. password: ${env.ftp.config.password:ftpPwd}
    7. remote-dir-path: ${env.ftp.config.remote-dir-path:/}
    1. /**
    2. * @author: Vainycos
    3. * @description ftp配置信息
    4. * @date: 2023/4/17 15:16
    5. */
    6. @Data
    7. @Component
    8. @ConfigurationProperties("ftp.config")
    9. public class FtpConfig {
    10. private String host;
    11. private int port;
    12. private String username;
    13. private String password;
    14. /** 初始读取根目录,当前默认/ */
    15. private String remoteDirPath;
    16. }

    3.1 获取客户端

    1. /**
    2. * 获取ftp客户端
    3. * @return
    4. */
    5. public FTPClient getFtpClient(){
    6. try {
    7. FTPClient ftpClient = new FTPClient();
    8. ftpClient.connect(ftpConfig.getHost() ,ftpConfig.getPort());
    9. // 10分钟连接时间
    10. ftpClient.setConnectTimeout(600000);
    11. ftpClient.setDefaultTimeout(600000);
    12. ftpClient.login(ftpConfig.getUsername() ,ftpConfig.getPassword());
    13. // login后设置传输的模式
    14. ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    15. // login后设置被动模式
    16. ftpClient.enterLocalPassiveMode();
    17. // login后设置编码
    18. String LOCAL_CHARSET = "GBK";
    19. // 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
    20. if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
    21. LOCAL_CHARSET = "UTF-8";
    22. }
    23. ftpClient.setControlEncoding(LOCAL_CHARSET);
    24. if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
    25. log.error("未连接到FTP,用户名或密码错误!");
    26. ftpClient.disconnect();
    27. } else {
    28. log.info("FTP连接成功!");
    29. }
    30. // 切换从某个根目录下开始扫描
    31. ftpClient.changeWorkingDirectory(ftpConfig.getRemoteDirPath());
    32. return ftpClient;
    33. }catch (IOException e) {
    34. log.error("ftp建立连接异常->{}", e);
    35. }
    36. return null;
    37. }

    3.2 获取ftp文件

    1. /**
    2. * 获取对应目录下的第一级目录文件
    3. * @param ftpClient client
    4. * @throws IOException
    5. */
    6. public void getFtpFirstDirectoryFiles(FTPClient ftpClient) throws IOException {
    7. log.info("ftpclient当前工作目录->{}", ftpClient.printWorkingDirectory());
    8. if (ftpClient != null) {
    9. FTPFile[] files = ftpClient.listFiles();
    10. for (FTPFile file : files) {
    11. String fileName = file.getName();
    12. if (file.isDirectory()){
    13. // 每次从根目录下查找第一级目录
    14. String firstDirectory = ftpConfig.getRemoteDirPath() + "/" + fileName;
    15. ftpClient.changeWorkingDirectory(firstDirectory);
    16. log.info("当前目录->{}, 开始扫描录音文件", firstDirectory);
    17. // 切换目录后直接遍历第一级的文件,不递归第二级目录
    18. dealFile(ftpClient);
    19. log.info("{}->目录扫描结束", firstDirectory);
    20. }
    21. }
    22. }
    23. }
    24. /**
    25. * 处理目录下的文件
    26. * @param ftpClient
    27. * @throws IOException
    28. */
    29. public void dealFile(FTPClient ftpClient) throws IOException {
    30. FTPFile[] files = ftpClient.listFiles();
    31. for (FTPFile file : files) {
    32. String fileName = file.getName();
    33. if (file.isDirectory()) {
    34. log.info("{}->为目录,跳过", fileName);
    35. continue;
    36. }
    37. String rootWorkingDirectory = ftpClient.printWorkingDirectory();
    38. log.info("获取到文件->{}, 开始获取ftp文件流, ftpclient工作目录->{}", fileName, ftpClient.printWorkingDirectory());
    39. // 开始获取ftp文件流
    40. InputStream inputStream = ftpClient.retrieveFileStream(new String(fileName.getBytes("UTF-8"), FTP.DEFAULT_CONTROL_ENCODING));
    41. if (inputStream == null){
    42. log.error("文件不存在->{}", fileName);
    43. return;
    44. }
    45. byte[] data = IOUtils.toByteArray(inputStream);
    46. inputStream.close();
    47. // 关键代码,如果不执行该代码,后续的ftpClient操作将会不生效
    48. ftpClient.completePendingCommand();
    49. // 省略...获取到了inputStream 文件流进行后续处理
    50. }
    51. }

    3.3 关闭ftp服务连接

    1. /**
    2. * 关闭FTP服务连接
    3. * @param ftpClient
    4. */
    5. public void disConnection(FTPClient ftpClient) {
    6. try{
    7. if(ftpClient.isConnected()){
    8. ftpClient.disconnect();
    9. }
    10. }catch(IOException e) {
    11. log.error("ftpClient.disconnect失败->{}", e);
    12. }
    13. }

    以上就是Java怎么读取传输FTP文件的详细内容,更多关于Java怎么读取传输FTP文件的资料请关注九品源码其它相关文章!