使用JavaRx / rx-mongodb下载grails中的文件

时间:2016-10-28 10:37:49

标签: mongodb grails rx-java reactivex

我正在尝试在Grails 3.2.1中下载文件。我有一个名为“file”的org.bson.types.Binary类型保存在mongo-db中。存储的文件大小以kb为单位,因此不需要GridFS。

我可以使用org.bson.types.Binary提供的getData()帮助程序访问byte []。使用标准的mongo-db驱动程序,我可以通过以下方式实现: -

json_file.read()

使用Mongo Rx驱动程序,更具体地说是RxJava。如何从Observer订阅下载文件? Grails提供了一个RxController,它为rx.render和rx.respond提供帮助,但是我无法理解响应。 TBH,我试图了解ReactiveX!这是我到目前为止: -

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
     }
  }


}

任何建议也将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以尝试以下(片段将在java / groovy&#34;伪代码&#34;) `

    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 observable压缩,但如果file为null则发出错误。如果您同步获得Response,请使用Observable.just(resp)

进行换行

答案 1 :(得分:0)

这应该有效。它使用render方法(参见http://mrhaki.blogspot.com.es/2013/09/grails-goodness-render-binary-output.html)。如果没有,请报告问题:

def stream() {

    FileDB.get((Serializable) params.id).subscribe({ fileDB fileDB->
        rx.render(fileName:"${fileDB.id}.wav", 
                  file:fileDB.file.getData(),
                  contentType:fileDB.contentType)
    })

}