我想为 FTP 下载创建一个进度条。我下载文件的服务器隐藏了所有目录和文件。我想显示下载进度。有什么办法可以获得文件大小吗?这是我当前的代码:
FTPclient = new FTPClient();
FTPclient.setListHiddenFiles(true);
FTPclient.connect(hostPart);
FTPclient.login(userName, passWord);
FTPclient.setFileType(FTP.BINARY_FILE_TYPE);
InputStream instream = FTPclient.retrieveFileStream(pathExcludingHostIncludingFirstSlash);
int l;
byte[] tmp = new byte[2048];
int updateCounter = 0;
int bytesDownloaded = 0;
while ((l = instream.read(tmp)) != -1) {
fos.write(tmp, 0, l);
bytesDownloaded+=2048;
updateCounter++;
if(updateCounter==3){
kilobytesDownloaded=(bytesDownloaded / 1024);
publishProgress((String[])null);
updateCounter=0;
}
最佳答案
无法在所有 FTP 服务中可靠地执行此操作。
FTP 协议(protocol)不提供获取文件大小的方法,因此您需要求助于请求目录列表并取消选择您返回的(特定于服务器的)文本。此外,不保证会启用目录列表,或者您将有权列出目录。
话虽如此,一些 FTP 库可以配置为尝试获取文件大小。例如,通过 Apache FTPClient 库,您可以(尝试)使用 listFiles(String)
方法并查看结果 FTPFile
对象。
编辑
@Kevin Brock 提到了 FTP SIZE 命令的可能性。
- 此命令于 2007 年在 RFC 3659 中首次定义。许多已部署的 FTP 服务器软件比这要早得多。
- SIZE 是可选命令;即,即使符合 RFC 3659 标准的服务器也不需要支持它。
- 即使服务器支持 SIZE,当前的 Apache FTPClient API 也不包含获取文件大小的方法(除了通过
listFiles
)。当然,这在未来可能会改变。 - ftp4j
FTPClient
类显然确实实现了 SIZE 并通过其fileSize(...)
方法使其可用。
关于java - 在 InputStream 之前获取 FileSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463934/