我有我期望會是一個相當普遍的任務,但我無法找到任何直接的答案,因此任何幫助在這裏將不勝感激。Wicket - 如何通過它的流下載文件?
簡短版本: 如何從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);
但現在,我使用SmbFile通過JCIFS,我不能只是做一個新的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應用程序?
編輯: 感謝喬普埃根,和肯特樂嘉塘書「享受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);
就是這樣,非常感謝! –