【问题标题】:Downloading a file in grails using JavaRx / rx-mongodb使用 JavaRx / rx-mongodb 在 grails 中下载文件
【发布时间】:2016-10-28 10:37:48
【问题描述】:

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

我可以使用 org.bson.types.Binary 提供的 getData() 助手访问 byte[]。使用标准 mongo-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
     }
  }


}

使用 Mongo 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()
        })

   }

}

任何建议也将不胜感激。

【问题讨论】:

标签: mongodb grails rx-java reactivex


【解决方案1】:

这应该可行。它使用渲染方法(参见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)
    })

}

【讨论】:

    【解决方案2】:

    您可以尝试以下操作(sn-ps 将在 java/groovy “伪代码”中) `

        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 一起压缩,但如果文件为空,则会发出错误。如果你同步得到Response,用Observable.just(resp)包装它

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多