2015-05-10 5 views
0

Я новичок в Голанге. Я пытаюсь получить PDF-файл, который я вставил. Я не использую GridFS, так как файлы, которые я буду хранить, составляют менее 16 МБ. Объект был вставлен (с использованием функции load_file) и идентификатором объекта, который я вижу с визуальным клиентом MongoDB, является ObjectId («554f98a400afc2dd3cbfb21b»).Golang - MongoDB (mgo) извлекает вставленный файл (BSON не GridFS)

К сожалению, файл создан на диске объемом 0 kb. Пожалуйста, сообщите, как правильно восстановить вставленный объект PDF.

Спасибо

package main 

import (
    "fmt" 
    "io/ioutil" 

    "gopkg.in/mgo.v2" 
) 

type Raw struct { 
    Kind byte 
    Data []byte 
} 

type RawDocElem struct { 
    Name string 
    Value Raw 
} 

func check(err error) { 
    if err != nil { 
     panic(err.Error()) 
    } 
} 

func read_file_content(AFileName string) []byte { 

    file_contents, err := ioutil.ReadFile(AFileName) 
    check(err) 
    return file_contents 
} 

func save_fetched_file(AFileName RawDocElem) { 
    ioutil.WriteFile("fisier.pdf", AFileName.Value.Data, 0644) 
    fmt.Println("FileName:", AFileName.Name) 
} 

func load_file(AFileName string, ADatabaseName string, ACollection string) { 
    session, err := mgo.Dial("127.0.0.1,127.0.0.1") 

    if err != nil { 
     panic(err) 
    } 
    defer session.Close() 

    session.SetMode(mgo.Monotonic, true) 

    c := session.DB(ADatabaseName).C(ACollection) 

    the_obj_to_insert := Raw{Kind: 0x00, Data: read_file_content(AFileName)} 

    err = c.Database.C(ACollection).Insert(&the_obj_to_insert) 
    check(err) 

} 

func get_file(ADatabaseName string, ACollection string, The_ID string) RawDocElem { 
    session, err := mgo.Dial("127.0.0.1,127.0.0.1") 

    if err != nil { 
     panic(err) 
    } 
    defer session.Close() 

    session.SetMode(mgo.Monotonic, true) 
    c := session.DB(ADatabaseName).C(ACollection) 

    result := RawDocElem{} 
    err = c.FindId(The_ID).One(&result) 
    return result 
} 

func main() { 
    //f_name := "Shortcuts.pdf" 
    db_name := "teste" 
    the_collection := "ColectiaDeFisiere" 
    //load_file(f_name, db_name, the_collection) 
    fmt.Sprintf(`ObjectIdHex("%x")`, string("554f98a400afc2dd3cbfb21b")) 
    save_fetched_file(get_file(db_name, the_collection, fmt.Sprintf(`ObjectIdHex("%x")`, string("554f98a400afc2dd3cbfb21b")))) 
} 
+0

Я изменил два элемента: а. objectID: = bson.ObjectIdHex (The_ID) плюс err = c.FindId (objectID) .One (& result) и b. возвращенный объект имеет тип Raw, а не RawDocElem. После этого он правильно сохранил pdf. – Tudor

ответ

0

Я думаю, что ваш способ построить идентификатор объекта является неправильным. Кроме того, вы забыли проверить ошибку после вызова FindId.

Я хотел бы попробовать импортировать пакет BSON и построить идентификатор объекта, используя что-то вроде:

hexString := "554f98a400afc2dd3cbfb21b" //24 digits hexadecimal string 
objid := bson.ObjectIdHex(hexString) 
... 
err = c.FindId(objid).One(&result) 
if err == nil { 
    // Do something with result 
    ... 
} else { 
    // Error 
    ... 
} 
Смежные вопросы