我希望在完全流式传输到客户端之后关闭一个mgo会话。起初,我认为这可能有效,但似乎defer
只是等待func开始返回或者什么。
func (c App) OpenFile(fileId string) revel.Result {
// convert string to bson.ObjectId
objId := bson.ObjectIdHex(fileId)
file, session := OpenFile(objId)
defer session.Close()
// memfile io.Reader, filename string, delivery ContentDisposition, modtime time.Time
var now = time.Now()
return c.RenderBinary(file, "filename", "inline", now)
}
答案 0 :(得分:0)
我不知道您的defer session.Close()
函数在做什么,但我假设它使用Mongo的GridFS来访问该文件。你是对的RenderBinary
在回归之前被召唤。如果您使用文件Revel closes it automatically,但在您的情况下,您还想关闭会话。
唯一的解决方法是制作可由Revel在package main
import (
"io"
"os"
"gopkg.in/mgo.v2"
)
type MongoReader struct {
io.Reader
File *os.File
Session *mgo.Session
}
func (mr *MongoReader) Read(p []byte) (n int, e error) {
return mr.File.Read(p)
}
func (mr *MongoReader) Close() {
mr.File.Close()
mr.Session.Close()
}
func main() {
mr := MongoReader{}
mr.Session, mr.File = OpenFile("abababa")
return c.RenderBinary(mr, "filename", "inline", now)
}
中使用的自定义Reader。类似的东西:
os.File
我没有在Revel上测试它,但由于代码非常简单,我认为它应该可行。也许您需要一些{{1}}特定方法。