使用 JavaRx / rx-mongodb 在 grails 中下载文件
Downloading a file in grails using JavaRx / rx-mongodb
我正在尝试下载 Grails 3.2.1 中的文件。我有一个名为 "file" 的 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()
})
}
}
任何建议也将不胜感激。
您可以尝试关注(片段将在 java/groovy "pseudocode" 中)
`
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*/});
想法是用 FileDB
可观察压缩 Response
,但如果文件为空则发出错误。如果您同步获得 Response
,请用 Observable.just(resp)
包装它
这应该有效。它使用 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)
})
}
我正在尝试下载 Grails 3.2.1 中的文件。我有一个名为 "file" 的 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()
})
}
}
任何建议也将不胜感激。
您可以尝试关注(片段将在 java/groovy "pseudocode" 中) `
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*/});
想法是用 FileDB
可观察压缩 Response
,但如果文件为空则发出错误。如果您同步获得 Response
,请用 Observable.just(resp)
这应该有效。它使用 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)
})
}