我有我期望的相当常见的任务,但我无法在任何地方找到任何直接的答案,所以在此非常感谢任何帮助。
简短版本: 如何从SmbFile的inputStream中创建IResourceStream?
长版: 在我的Wicket应用程序中,我让用户填写调查问卷,然后在他们正确完成后下载文件。该文件位于Samba服务器上,因此我使用的是SmbFile,它运行正常,所以没有问题。我正在使用由Sven Meier,Ernesto Barreiro和Jordi Deu-Pons编写的AJAXDownload,因为我需要我的按钮才能使用Ajax功能来检查表单是否填写正确,然后开始下载。当我开始使用计算机上的文件时,我可以简单地使用
final AJAXDownload download = new AJAXDownload()
{
@Override
protected IResourceStream getResourceStream()
{
IResourceStream resStream = new FileResourceStream(file);
return resStream;
}
@Override
protected String getFileName() {
return fileName;
}
};
form.add(download);
但是现在我通过JCIFS使用SmbFile,我不能只创建一个新的FileResourceStream。我发现我可以使用java.io.File.createTempFile从smbFile的inputStream创建一个临时文件,然后像这样使用临时文件:
protected IResourceStream getResourceStream()
{
java.io.File tempFile = null;
try {
tempFile = File.createTempFile(smbFile.getName(), smbFile.getContentType());
} catch (IOException e1) {
e1.printStackTrace();
}
try {
Files.writeTo(tempFile, smbFile.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
IResourceStream resStream = new FileResourceStream(tempFile);
return resStream;
}
这适用于小文件,但我也会有一些相当大的文件,因为它在发送之前制作了文件的临时副本,这需要很长时间,而且设计很差。 有关如何将我的smbFile下载到wicket应用程序中的任何想法?
编辑: 感谢Joop Eggen和Kent Ka lok Tong撰写的“享受Wicket的Web开发”一书,我有以下解决方案,以防其他人遇到类似情况:
final AJAXDownload download = new AJAXDownload()
{
@Override
protected IResourceStream getResourceStream()
{
IResourceStream resStream = new AbstractResourceStream() {
InputStream inStream;
public InputStream getInputStream() throws ResourceStreamNotFoundException{
try {
inStream = smbFile.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
return inStream;
}
public void close() throws IOException {
inStream.close();
}
public String getContentType() {
return smbFile.getContentType();
}
};
return resStream;
}
@Override
protected String getFileName() {
return smbFileName;
}
};
form.add(download);
答案 0 :(得分:4)
您应该派生一个扩展AbstractResourceStream的SmbResourceStream,并通过覆盖getInputStream
和close
来实现提供一个InputStream。您已经拥有smbFile.getInputStream()
。