FTP切换目录

ftpClient.changeWorkingDirectory("/" + rootPath + "/" + filePath)

路径最前面有/斜杠,是绝对路径,回到起点重新到对应的目录下
路径最前面没有/斜杠,是绝对路径,由这个文件所在的路径直接到对应的目录下
比如有两个目录D:/files/upload/2019-08-20D:/files/upload/2019-08-21
从20号的文件夹到21号的文件夹
使用绝对路径是:
最终进入的文件夹是 D:/files/upload/2019-08-21

ftpClient.changeWorkingDirectory("/upload/2019-08-20")
ftpClient.changeWorkingDirectory("/upload/2019-08-21")

使用相对路径是:
最终进入的文件夹是 D:/files/upload/2019-08-20/upload/2019-08-21

ftpClient.changeWorkingDirectory("upload/2019-08-20")
ftpClient.changeWorkingDirectory("upload/2019-08-21")

使用绝对路径

    public static void downloadFile(List fileModelList, ZipOutputStream zipOut, String rootPath,
                                    String host, int port, String username, String password) {
        FTPClient ftpClient = new FTPClient();
        ftpClient.setControlEncoding("utf-8");
        try {
            int replyCode;
            ftpClient.connect(host, port);
            // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftpClient.login(username, password);// 登录
            replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                ftpClient.disconnect();
            }

            for (FileModel fileModel : fileModelList) {
                String filePath = fileModel.getFilePath();
                ftpClient.changeWorkingDirectory("/" + rootPath + "/" + filePath);  //转移到FTP服务器目录,绝对路径
                String fileName = fileModel.getFileName().toString();
//                FTPFile[] fs = ftp.listFiles();  //当天目录下文件太多的话,导致读取很慢
//                for (FTPFile ff : fs) {
//                    String f = new String(ff.getName().getBytes(Charset.forName("ISO-8859-1")), Charset.forName("GBK"));
//                    if (f.equals(fileName)) {
//                        inputStream = ftp.retrieveFileStream(ff.getName());
//                    }
//                }

                ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
                ftpClient.retrieveFile(fileName, byteArrayOutputStream);
                if (byteArrayOutputStream.size() == 0) {
                    System.out.println("错误的:" + rootPath + "/" + fileModel.getFilePath() + "/" + fileName);
                } else {
                    System.out.println("正确的:" + rootPath + "/" + fileModel.getFilePath() + "/" + fileName);
                }
                InputStream inputStream = byteArrayOutputStream.toInputStream();

                if (inputStream != null) {
                    FileUtils.zipFile(inputStream, zipOut, fileModel.fileOriginName + "." + fileModel.getFileType());
                    inputStream.close();
                }
            }
            ftpClient.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
    }

如果要使用相对路径,最终也能进入21号的文件夹的话,需要一层一层返回,最终返回到起点,然后再进入

//方法一
ftpClient.changeToParentDirectory();
//方法二
ftpClient.changeWorkingDirectory("../");

当进入第一条记录的目录时,是没有问题的,直接从根目录进来的。当进入第二条记录的目录时就要做判断了,如果和前一条记录的目录相同则不需要切换,如果和前一条记录的目录不相同就要切换。
一层一层往根目录切换,到底需要几次?这个要根据前一条记录的目录判断。比如目标所在地址为D:/files/jscmp/upload/2019-08-20,那么从2019-08-20所在的目录upload切回根目录D:/files就需要两次

    public static void downloadFile(List fileModelList, ZipOutputStream zipOut, String rootPath,
                                    String host, int port, String username, String password) {
        FTPClient ftpClient = new FTPClient();
        ftpClient.setControlEncoding("utf-8");
        try {
            int replyCode;
            ftpClient.connect(host, port);
            // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftpClient.login(username, password);// 登录
            replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                ftpClient.disconnect();
            }

            for (int i = 0; i < fileModelList.size(); i++) {
                if (i == 0) {
                    FileModel fileModel = fileModelList.get(0);
                    ftpClient.changeWorkingDirectory(rootPath + "/" + fileModel.getFilePath());// 转移到FTP服务器目录
                    String fileName = fileModel.getFileName().toString();
                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                    ftpClient.retrieveFile(fileName, byteArrayOutputStream);
//                    if (byteArrayOutputStream.size() == 0) {
//                        System.out.println("错误的:" + rootPath + "/" + fileModel.getFilePath() + "/" + fileName);
//                    } else {
//                        System.out.println("正确的:" + rootPath + "/" + fileModel.getFilePath() + "/" + fileName);
//                    }
                    InputStream inputStream = byteArrayOutputStream.toInputStream();

                    if (inputStream != null) {
                        FileUtils.zipFile(inputStream, zipOut, fileModel.fileOriginName + "." + fileModel.getFileType
                                ());
                        inputStream.close();
                    }
                } else {
                    FileModel fileModel = fileModelList.get(i);
                    FileModel fileModel1 = fileModelList.get(i - 1); //上一次的数据
                    if (!fileModel.getFilePath().equals(fileModel1.getFilePath())) {
                        String[] split = fileModel1.getFilePath().split("/");  //根据上一次进入的目录往上切目录
//                        for (int i1 = 0; i1 < (split.length + 1); i1++) {
////                            ftpClient.changeToParentDirectory();   //根目录为FTP设置的目录,10.10.5.12服务器 D:\ftpserver
//                            ftpClient.changeWorkingDirectory("../");
//                        }

                        //直接切回根目录
                        ftpClient.changeWorkingDirectory("/");
                    }
                    ftpClient.changeWorkingDirectory(rootPath + "/" + fileModel.getFilePath());// 转移到FTP服务器目录
                    String fileName = fileModel.getFileName().toString();

                    ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
                    ftpClient.retrieveFile(fileName, byteArrayOutputStream);
//                    if (byteArrayOutputStream.size() == 0) {
//                        System.out.println("错误的:" + rootPath + "/" + fileModel.getFilePath() + "/" + fileName);
//                    } else {
//                        System.out.println("正确的:" + rootPath + "/" + fileModel.getFilePath() + "/" + fileName);
//                    }
                    InputStream inputStream = byteArrayOutputStream.toInputStream();

                    if (inputStream != null) {
                        FileUtils.zipFile(inputStream, zipOut, fileModel.fileOriginName + "." + fileModel.getFileType());
                        inputStream.close();
                    }
                }
            }
            ftpClient.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
    }

项目里使用了相对路径,导致进入下一个目录后找不到对应的图片,读取图片IO流失败,所以压缩出来的图片就是0字节了

你可能感兴趣的:(FTP切换目录)