2016-07-22 32 views
0

Ich möchte eine mgo-Sitzung beenden, nachdem sie vollständig an den Client gestreamt wurde. Zuerst dachte ich, das könnte funktionieren, aber es scheint, dass die defer nur wartet, bis der Func beginnt oder etwas zurückkehrt.Wie verschiebt man eine mgo Session, bis sie vollständig an den Client gestreamt wurde?

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

Antwort

0

Ich habe keine Ahnung, was Ihre OpenFile Funktion zu tun, aber ich nehme an, es Mongo GridFS mit der Datei zuzugreifen. Du hast Recht defer session.Close() heißt kurz vor der Rückkehr. Wenn Sie die Datei Revel closes it automatically verwenden, möchten Sie in Ihrem Fall die Sitzung auch schließen.

Der einzige Weg ist es, benutzerdefinierte Reader, die von Revel in RenderBinary verwendet werden können, zu machen. Etwas wie:

Ich habe es nicht auf Revel getestet, aber als Code ist ganz einfach Ich denke, es sollte funktionieren. Vielleicht werden Sie einige os.File spezifische Methoden benötigen.