2016-07-22 6 views
0

クライアントに完全にストリーミングされた後、mgoセッションを終了したいとします。最初は、これはうまくいくかもしれないと思っていましたが、deferはfuncが復帰するまで待っているようです。クライアントに完全にストリーミングされるまで、mgoセッションを延期する方法はありますか?

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

私はあなたのOpenFile機能がやって何見当がつかないが、私はそれがファイルにアクセスするためにはMongoのGridFSを使用して想定しています。あなたは正しいです戻りの直前にdefer session.Close()と呼ばれています。ファイルRevel closes it automaticallyを使用していますが、あなたの場合は、セッションを終了したいこともあります。

唯一の方法はRevelがRenderBinaryで使用できるカスタムリーダーを作成することです。ような何か:

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

私はレヴェルでそれをテストしていないが、コードは非常に簡単であるように私はそれが動作するはずだと思います。たぶんos.File特定のメソッドが必要になるでしょう。

関連する問題