2

私はかなり一般的なタスクになると予想していますが、どこにも簡単な答えが見つからないので、ここで助けていただければ幸いです。

短いバージョン: 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);
4

1 に答える 1

4

AbstractResourceStreamを拡張する SmbResourceStream を派生させ、 and をオーバーライドして読み取り用の InputStream を提供する実装を実装する必要がgetInputStreamありますclose。あなたはすでに持っていますsmbFile.getInputStream()

于 2012-11-19T21:20:48.500 に答える