ftpClient.changeWorkingDirectory("/" + rootPath + "/" + filePath)
路径最前面有/斜杠,是绝对路径,回到起点重新到对应的目录下
路径最前面没有/斜杠,是绝对路径,由这个文件所在的路径直接到对应的目录下
比如有两个目录D:/files/upload/2019-08-20
和D:/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字节了