gpt4 book ai didi

java - FtpClient 检索文件流 [挂起]

转载 作者:行者123 更新时间:2023-12-02 12:00:36 26 4
gpt4 key购买 nike

我有一个本地 FTP 服务器(使用 FileZilla 服务器创建),并且 XLS 文件很少。我需要将文件输入流返回到我的 Java 应用程序,以便我可以解析数据等。

为此,我尝试使用 FTPClient,但由于某种原因,在尝试从文件(大于 40KB 或)返回输入流时,FTPClient.retrieveFileStream() 挂起。

我知道有与此类似的问题,并且我已经阅读了所有这些问题,至少是我能找到的所有问题,但没有任何帮助我。这真的很烦人,如果可能的话我希望得到一些帮助。

相关代码部分:

public FTPwrapper(){

ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Properties props = (Properties) context.getBean("ftp_props");

this.FTPhost = props.getProperty("host");
this.FTPuser = props.getProperty("user");
this.FTPpass = props.getProperty("pass");
this.FTPport = Integer.parseInt(props.getProperty("port"));
this.filesPath = props.getProperty("filesPath");
//start ftp connection
try {
client.connect(this.FTPhost, this.FTPport);
client.login(this.FTPuser, this.FTPpass);
client.setBufferSize(1024 * 1024);
client.enterLocalPassiveMode();
client.setFileType(FTP.BINARY_FILE_TYPE);
} catch (IOException e) {
e.printStackTrace();
}
}
<小时/>
public InputStream returnFileStream(String FileName){

InputStream inputstream = null;

try {
String remoteFile = this.filesPath+FileName;
inputstream = client.retrieveFileStream(remoteFile);
client.completePendingCommand();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (client.isConnected()) {
client.logout();
client.disconnect();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}

return inputstream;
}
<小时/>
public static void main(String[] args){ 
FTPwrapper ftp = new FTPwrapper();
InputStream inputstream = ftp.returnFileStream("2012 m muzieju statistika.xls");
}
<小时/>

FPT 日志:

...login commands...
227 Entering Passive Mode
RETR /vtipsis_data/KT/2012 m muzieju statistika.xls
50 Opening data channel for file download from server of "/vtipsis_data/KT/2012 m muzieju statistika.xls" //Hangs...

FTP 连接最终超时后,出现 java 异常:

java.io.IOException: Your file contains 383 sectors, but the initial DIFAT array at index 4 referenced block # 505. This isn't allowed and  your file is corrupt
at org.apache.poi.poifs.storage.BlockAllocationTableReader.<init>(BlockAllocationTableReader.java:103)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:151)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:322)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:303)

我认为此异常是因为仅返回了 XLS 文件输入流的一部分。这就是我的问题。有什么想法可以解决这个问题吗?

最佳答案

这不是我想要的答案,而是一个足够的解决方法...我没有尝试使用 retrieveFileStream 直接检索流,而是使用 retrieveFile下载文件作为临时系统文件,并将我从retrieveFile获得的OutputStream转换为InputStream。之后我只需删除下载的临时文件。

尝试使用it.sauronsoftware.ftp4j,但它没有类似retrieveFileStream的方法/功能,只能下载文件。

编辑:

我找到了一种无需使用 retrieveFileStream 或下载文件即可返回文件输入流的方法。由于retrieveFile返回OutputStream,我可以将OutputStream转换为InputStream(为什么我之前没有想到这一点?),例如:

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
client.retrieveFile(remoteFile, outputStream);
InputStream inputstream = new ByteArrayInputStream(outputStream.toByteArray());

关于java - FtpClient 检索文件流 [挂起],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25485195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com