私はかなり一般的なタスクになると予想していますが、どこにも簡単な答えが見つからないので、ここで助けていただければ幸いです。
短いバージョン: 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 による本「Enjoying Web Development with Wicket」のおかげで、他の誰かが同様の状況に陥った場合に備えて、以下の解決策があります。
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);