我是靠谱客的博主 内向雪碧,最近开发中收集的这篇文章主要介绍从ftp读取文件,存到指定文件夹下,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

上次写了一篇读取文件复制到指定文件夹下的文章
本次是从ftp读取,然后复制到指定文件夹下,代码都差不多,不知道ftp怎么发布的,自行百度一下,教程很多,下面文件读取贴代码

/**
     * 登陆FTP服务器
     *
     * @param host     FTPServer IP地址
     * @param port     FTPServer 端口
     * @param userName FTPServer 登陆用户名
     * @param password FTPServer 登陆密码
     * @return FTPClient
     * @throws IOException
     */
    public static FTPClient login(String host, String port, String userName, String password) throws IOException{
        FTPClient ftpClient = new FTPClient();
        // 防止中文目录乱码
        ftpClient.setAutodetectUTF8(true);
        ftpClient.setConnectTimeout(60000);
        // 连接FTP服务器
        ftpClient.connect(host, Integer.valueOf(port));

        if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
            // 登陆FTP服务器
            if (ftpClient.login(userName, password)) {
                // 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
                if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(
                        "OPTS UTF8", "ON"))) {
                    ftpClient.setControlEncoding("UTF-8");
                }else {
                    ftpClient.setControlEncoding("GBK");
                }

                // 设置传输的模式,以二进制流的方式读取
                ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
                log.info("FTP服务连接成功!");
            }else {
                log.error("FTP服务用户名或密码错误!");
                disConnection(ftpClient);
            }
        }else {
            log.error("连接到FTP服务失败!");
            disConnection(ftpClient);
        }
        return ftpClient;
    }

    /**
     * 关闭FTP服务链接
     * @throws IOException
     */
    private static void disConnection(FTPClient ftpClient) throws IOException {
        if(null != ftpClient && ftpClient.isConnected()){
            ftpClient.disconnect();
        }
    }

下面是文件读取,参考了哪位大哥也忘了,自己加了一些删除和判断

@Value("${file.uploadFolder}")
    private String uploadFolder; //读取后存放文件的文件夹

    @Value("${ftp.server.fileUrl}")
    private String ftpFolder; //ftp文件夹

    @Value("${ftp.server.userName}")
    private String userName; //ftp用户名

    @Value("${ftp.server.password}")
    private String password; //ftp密码

    @Value("${ftp.server.host}")
    private String ftpServer; //ftp主机ip

    @Value("${ftp.server.port}")
    private String ftpPort; //ftp端口号

    /**
     * 得到所有路径以及子路径:递归遍历所有文件到路径。
     * @param ftp    FTPClient对象
     * @param path   当前的路径
     * @param pathArray   保存当前的路径并将此路径集合带到下载方法中去
     * @throws IOException
     */
    public  void getPath(FTPClient ftp, String path, ArrayList<String> pathArray) throws IOException{
        FTPFile[] files = ftp.listFiles();
        for (FTPFile ftpFile : files) {
            if(ftpFile.getName().equals(".")||ftpFile.getName().equals(".."))continue;
            if(ftpFile.isDirectory()){//如果是目录,则递归调用,查找里面所有文件
                path+="/"+ftpFile.getName();
                pathArray.add(path);
                ftp.changeWorkingDirectory(path);//改变当前路径
                getPath(ftp,path,pathArray);//递归调用
                path=path.substring(0, path.lastIndexOf("/"));//避免对之后的同目录下的路径构造作出干扰,
            }
        }
    }

    /**
     * 下载到指定的本地文件夹中
     * @param ftp             FTPClient对象
     * @param pathArray       为1中带出的路径集合
     * @param localRootPath   本地路径
     * @throws IOException
     */
    public  void download(FTPClient ftp,ArrayList<String> pathArray,String localRootPath) throws IOException{
        //日期目录
        //String dateString = ym.dateTime();

        for (String string : pathArray) {
            String localPath=localRootPath+string;
            File localFile = new File(localPath);
            if (!localFile.exists()) {
                localFile.mkdirs();
            }
        }
        for (String string : pathArray) {
            String localPath=localRootPath+string;//构造本地路径
            ftp.changeWorkingDirectory(string);
            FTPFile[] file=ftp.listFiles();
            for (FTPFile ftpFile : file) {
                if(ftpFile.getName().equals(".")||ftpFile.getName().equals(".."))continue;
                File localFile = new File(localPath);
                if(!ftpFile.isDirectory()){
                    File fileCheck = new File(localFile+"/" + ftpFile.getName());
                    //文件已存在不需要下载
                    if (fileCheck.exists()) {
                        System.out.println(localFile+"/" + ftpFile.getName() + " 文件已存在。");
                        continue;
                    }
                    OutputStream is = new FileOutputStream(localFile + "/" + ftpFile.getName());
                    ftp.retrieveFile(ftpFile.getName(), is);
                    is.close();
                    //删除源文件,先注释,看后期需不需要放开
                    /*File fileOld = new File(ftpFolder + dateString + "/" + ftpFile.getName());
                    if (fileOld.exists()){
                        fileOld.delete();
                    }else {
                        System.out.println("文件不存在");
                    }*/
                    //删除源文件,先注释,看后期需不需要放开
                    /*ftp.deleteFile(ftpFolder + dateString + "/" + ftpFile.getName());*/
                }
            }
        }
    }

    @PostMapping("/test")
    public void ceshi() throws IOException {

        FTPClient ftpClient = FtpUtils.login(ftpServer,ftpPort,userName,password);
        String path="";
        ArrayList pathArray=new ArrayList();
        getPath(ftpClient,path,pathArray);
        //System.out.println(pathArray);
        download(ftpClient, pathArray, uploadFolder);

        ftpClient.logout();
        ftpClient.disconnect();

    }

就这样,完结,撒花~

最后

以上就是内向雪碧为你收集整理的从ftp读取文件,存到指定文件夹下的全部内容,希望文章能够帮你解决从ftp读取文件,存到指定文件夹下所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部