使用Apache Commons Net从Web Ftp通过Java程序下载文件时遇到问题。
假设我要下载此文件: webftp.vancouver.ca/opendata/bike_rack/BikeRackData.csv 这不是您可以通过HTTP请求下载的文件。我可以用我的浏览器来做,因为我正在使用FTP插件。
从FTP服务器检索文件的传统方式似乎不适用于特定类型( Web FTP )。我可以建立连接,但文件检索不起作用,因为文件是空的。
我使用的代码(使用Apache Commons检索文件的经典方法)如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory;
public class FTPDownload {
final private FTPClient ftp = new FTPClient();
private String input;
private String server;
private String path;
private String destination;
private String fileName;
public FTPDownload(String input, String destination) {
this.input = input;
this.destination = destination;
if (input != null && input.contains("/")) {
String[] elts = input.split("/");
server = elts[0];
fileName = elts[elts.length - 1];
path = input.substring(server.length() - 1);
} else {
server = input;
path = null;
}
}
public FTPDownload(String server, String path, String destination) {
this.server = server;
this.path = path;
this.destination = destination;
if (path != null && path.contains("/")) {
String[] elts = path.split("/");
fileName = elts[elts.length - 1];
}
}
public boolean retrieveFile() throws IOException {
boolean error = false;
ftp.connect(server);
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return false;
}
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterRemotePassiveMode();
File download = new File(destination + "/" + fileName);
OutputStream outputStream;
outputStream = new FileOutputStream(download);
ftp.changeWorkingDirectory(path.substring(0, path.length() - fileName.length()));
ftp.setParserFactory(new DefaultFTPFileEntryParserFactory());
String[] list = ftp.listNames();
ftp.retrieveFile(fileName, outputStream);
outputStream.close();
ftp.logout();
return error;
}
public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
FTPDownload myFtp = new FTPDownload("webftp.vancouver.ca", "/opendata/bike_rack/BikeRackData.csv", "E:\\test");
myFtp.retrieveFile();
}
}
希望问题是可以理解的。 谢谢。