2012-11-19 46 views
2

我有我期望會是一個相當普遍的任務,但我無法找到任何直接的答案,因此任何幫助在這裏將不勝感激。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); 

回答

4

您應該派生一個SmbResourceStream,它擴展了AbstractResourceStream,並通過覆蓋getInputStreamclose來實現提供InputStream進行讀取。您已有smbFile.getInputStream()

+0

就是這樣,非常感謝! –