2015-05-10 150 views
0

我是Golang的新手。 我正在嘗試檢索已插入的PDF文件對象。我沒有使用GridFS,因爲我要存儲的文件在16 MB以下。 該對象已被插入(使用load_file函數),而我在MongoDB可視客戶端看到的對象ID是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

我想你打造的對象ID的方法是錯誤的。此外,您忘記測試FindId調用後的錯誤。

我會嘗試導入BSON包,並使用類似構建對象ID:

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 
    ... 
} 
相關問題