2012-11-19 3 views
2

나는 꽤 일반적인 일이 될 것으로 기대하지만, 나는 어떤 정직한 대답도 찾을 수 없다. 그래서 여기있는 어떤 도움도 크게 감사 할 것이다.Wicket - 스트림을 통해 파일을 다운로드하는 방법?

짧은 버전 : SmbFile의 inputStream에서 IResourceStream을 만들려면 어떻게해야합니까?

긴 버전 : 내 Wicket 앱에서 사용자가 설문지를 작성한 다음 제대로 작성한 후 파일을 다운로드하도록합니다. 이 파일은 Samba 서버에 있으므로 SmbFile을 사용하고 있습니다. 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 할 수 없습니다.

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의 inputStream을에서 임시 파일을 만들 java.io.File.createTempFile을 사용하여 다음과 같이 임시 파일을 사용할 수 있다는 것을 발견 약간 큰 파일을 가지고 있으며 파일을 보내기 전에 파일의 임시 복사본을 만들기 때문에 매우 오랜 시간이 걸리고 단지 디자인이 좋지 않습니다. wicket 앱에서 다운로드 한 smbFile을 어떻게 얻을 수 있는지에 대한 아이디어가 있습니까?

편집 :

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
: 윱 Eggen 덕분에, 켄트 카 LOK 통에 의해 도서 '개찰구로 웹 개발을 즐기는'나는 경우 다른 사람이 비슷한 상황에서 끝에서 아래의 솔루션을

AbstractResourceStream을 확장하는 SmbResourceStream을 파생시키고 getInputStreamclose을 재정 의하여 읽기 위해 InputStream을 제공하도록 구현해야합니다. 이미 smbFile.getInputStream()이 (가) 있습니다.

+0

정확히 그 것이 었습니다. 정말 고마워요! –

관련 문제