我试图从服务器下载文件,但它得到0字节......
这是我的FTPDownload类
public boolean getFile(String filename){
try {
FTPClient ftpClient = new FTPClient();
ftpClient.connect(ftpAddress, ftpPort);
ftpClient.login(ftpUser, ftpPass);
int reply = ftpClient.getReplyCode();
//FTPReply stores a set of constants for FTP reply codes.
if (!FTPReply.isPositiveCompletion(reply))
{
ftpClient.disconnect();
return false;
}
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setBufferSize(1024*1024);
String remoteFile = serverPath + filename;
logger.debug("remote file is: "+remoteFile); //correct path
File tempFile = new File(downloadDir+"temp.jar");
logger.debug("file will be "+tempFile.toString()); //correctly created
OutputStream os = new BufferedOutputStream(new FileOutputStream(tempFile));
ftpClient.retrieveFile(remoteFile, os);
os.close();
String completeJarName = downloadDir+jarName;
//delete previous file
File oldFile = new File(completeJarName);
FileUtils.forceDelete(oldFile);
//rename
File newFile = new File(completeJarName);
FileUtils.moveFile(tempFile, newFile);
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
}
} catch (IOException e) {
// TODO Auto-generated catch block
logger.error("errore ftp", e);
return false;
}
return true;
}
基本上,临时fie被创建,然后前一个文件被取消并且临时文件被重命名,但是它是0字节......我无法理解出错的地方......
答案 0 :(得分:0)
我使用apache.common进行FTP下载。这是代码,你可以尝试
public class FTPUtils {
private String hostName = "";
private String username = "";
private String password = "";
private StandardFileSystemManager manager = null;
FileSystemOptions opts = null;
public FTPUtils(String hostName, String username, String password) {
this.hostName = hostName;
this.username = username;
this.password = password;
manager = new StandardFileSystemManager();
}
private void initFTPConnection() throws FileSystemException {
// Create SFTP options
opts = new FileSystemOptions();
// SSH Key checking
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(
opts, "no");
// Root directory set to user home
SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, false);
// Timeout is count by Milliseconds
SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000);
}
public void onUpload(String ftpfolder, String localFilePath, String fileName) {
File file = new File(localFilePath);
if (!file.exists())
throw new RuntimeException("Error. Local file not found");
try {
manager.init();
// Create local file object
FileObject localFile = manager.resolveFile(file.getAbsolutePath());
String remoteFilePath = "/" + ftpfolder + "/" + fileName;
// Create remote file object
FileObject remoteFile = manager.resolveFile(
createConnectionString(hostName, username, password,
remoteFilePath), opts);
// Copy local file to sftp server
remoteFile.copyFrom(localFile, Selectors.SELECT_SELF);
System.out.println("Done");
} catch (Exception e) {
// Catch and Show the exception
} finally {
manager.close();
}
}
public static String createConnectionString(String hostName,
String username, String password, String remoteFilePath) {
return "sftp://" + username + ":" + password + "@" + hostName + "/"
+ remoteFilePath;
}
}
答案 1 :(得分:0)
BufferedOutputStream将数据写入内部缓冲区,因此您可能需要在关闭之前刷新 outputStream:
OutputStream os = new BufferedOutputStream(new FileOutputStream(tempFile));
ftpClient.retrieveFile(remoteFile, os);
os.flush();
os.close();
另一个提示:
始终为缓冲流提供缓冲区大小(通常为8Kb的倍数)。
在实例化流时始终使用try-with-resources指令,并让它们自动关闭。
catch
条款。应该修复(如果您希望程序从该异常中恢复)传播向上(默认情况下,传播)。只有一个日志不太可能是最好的治疗方法。