2016-10-28 59 views
0

我正嘗試在Grails 3.2.1中下載文件。我有一個名爲「文件」的org.bson.types.Binary類型保存在mongo-db中。存儲的文件的大小以kb爲單位,因此不需要GridFS。使用JavaRx/rx-mongodb下載grails中的文件

我可以使用org.bson.types.Binary提供的getData()輔助函數來訪問byte []。使用標準蒙戈-DB驅動程序,我可以用下面的實現: -

class DownloadController { 

    def stream() { 
    def fileDB = FileDB.get(params.id) 
    if(fileDB) { 
     response.setContentType(fileDB.contentType) 
     response.setHeader("Content-disposition", "filename=${fileDB.id}.wav") 
     response.outputStream << fileDB.file.getData() 
    } else { 
     //handle error 
    } 
    } 


} 

隨着蒙戈的Rx驅動程序,更具體RxJava。如何從Observer訂閱下載文件? Grails提供了一個RxController,它爲rx.render和rx.respond提供助手,但是我無法得到迴應。 TBH,我試圖讓我的頭繞過ReactiveX!這是我到目前爲止: -

class DownloadController implements RxController { 

    def stream() { 

     FileDB.get((Serializable) params.id).subscribe({ fileDB fileDB-> 
      //How do I handle this?? 
      response.setContentType(fileDB.contentType) 
      response.setHeader("Content-disposition", "filename=${fileDB.id}.wav") 
      response.outputStream << fileDB.file.getData() 
     }) 

    } 

} 

任何意見也將不勝感激。

+0

轉問這個問題:下載文件附件(http://stackoverflow.com/questions/39536317/open-pdf-file-in-new-window- from-variable-path-name-gsp-page/39542861)#39542861) –

回答

0

你可以試試以下(代碼段將是在Java /常規「僞」) `

Observable<Response> response = ...; 
    Observable<FileDB> fileDb = FileDB.get(params.id); 
    Observable<Response> processedResponse = response.zipWith(
      fileDb.filter(content != null) 
       .switchIfEmpty(Observable.error(new RuntimeException())), 
      (resp, file) -> { 
       resp.setContentType(file.contentType) 
       resp.setHeader("Content-disposition", "filename=${fileDB.id}.wav") 
       resp.outputStream << fileDB.file.getData()  

       return resp; 
      }); 

processedResponse 
    .subscribeOn(Shedulers.io()) 
    .subscribe(response -> {/*save response*/}, error -> {/*handle error*/}); 

的想法是拉鍊ResponseFileDB觀察到的,但發出錯誤,如果文件爲空。如果您同時獲得Response,請將其包裝爲Observable.just(resp)