2017-10-17 56 views
1

mgo를 사용하여 파일을 저장하는 것에 대한 여러 블로그를 읽었지만 특정 요구 사항에 대한 해결책을 찾을 수 없으면 shoutout을 도와주세요! 삽입 아래GoLang mgo를 사용하여 MongoDb에 pdf 저장

가 MongoDB를에 개체 : 파일의 보류를 얻을 수 아래

var dbSchoolPojo dbSchool 
i := bson.NewObjectId() 
dbSchoolPojo.ID = i 
coll := db.C("school") 
coll.Insert(&dbSchoolPojo) 

:

dbSchoolPojo.pdf = file.Bytes(); //Of course Bytes() is invalid method 
: 객체를 삽입하기 전에,

file, handler, err := r.FormFile("pdf") //Able to get file from r *http.Request 

지금, 나는 같은 파일 이상으로 설정해야합니다

내 구조체 개체 :

type dbSchool struct { 
    ID bson.ObjectId `json:"id" bson:"_id,omitempty"` 
    ... 
    Pdf []byte `json:"pdf" bson:"pdf"` 
    ... 
} 

평신도의 용어는 질문입니다 : mgo 드라이버를 사용하여 GoLang 구조체를 통해 mongoDb에 파일 (HTML 양식에서받은 파일)을 어떻게 삽입합니까?

읽어 주셔서 감사합니다. :)


업데이트 : 코드 아래

Binary('EWHKDSH876KJHlkjdswsddsfsd3232432njnjkn2dljDSFSDFIJSFD333...') 

가 오류없이 작동하지만, PDF 파일을 제공하지 않습니다 :

PDF는 아래와 같이하여 MongoDB에 저장됩니다

func DownloadPdf(w http.ResponseWriter, r *http.Request, db mongoDB) { 
    var school dbSchool 
    coll := db.C("schools") 

    incomingId = "59e6404e2f68182a74610f19"; //This mongo DB _id is received from GET URL request 

    err := coll.Find(bson.M{"_id": bson.ObjectIdHex(incomingId)}). 
     Select(bson.M{"pdf": 1}).One(&school) 
    if err != nil { 
     serve404(w, r, db) 
     return 
    } 

    buffer := school.Pdf 
    w.Header().Set("Content-Disposition", "attachment; filename=abc.pdf") 
    w.Header().Set("Content-Type", "application/pdf") 
    w.Header().Set("Content-Length", strconv.Itoa(len(buffer))) 

    if _, err := w.Write(buffer); err != nil { 
     log.Println("unable to serve image.") //This line is not executed 
    } 
} 

JQuery co 드 콘텐츠를 요청합니다 :

 $(".downloadPdfFile").click(function() { 
      var domain = document.location.origin; 
      window.open(domain+'/brochure/59e6404e2f68182a74610f19', '_blank'); 
     }); 

답변

2

fileRequest.FormFile()입니다 유형 multipart.File입니다 반환 : 당신은 단순히 예를 들어, 내용을 읽을 수 있도록, 그것은 io.Reader 구현

type File interface { 
    io.Reader 
    io.ReaderAt 
    io.Seeker 
    io.Closer 
} 

ioutil.ReadAll()와 : 다음

data, err := io.ReadAll(file) 
// Handle error 

:

dbSchoolPojo.Pdfdata = data 

그러나 문서의 한 부분으로 큰 파일을 저장하는 효율적인/최적이 아니다. 대신 mgo으로 지원되는 MongoDB GridFS을 확인하십시오 : Database.GridFS(). 당신이 경우는 먼저 메모리에 모든 내용을 읽을 필요없이 파일을 저장할 수

func check(err error) { 
    if err != nil { 
     panic(err.String()) 
    } 
} 
file, err := db.GridFS("fs").Create("myfile.txt") 
check(err) 
n, err := file.Write([]byte("Hello world!")) 
check(err) 
err = file.Close() 
check(err) 
fmt.Printf("%d bytes written\n", n) 

GridFS 사용 : 여기

은 (GridFS.Create()에서 가져온 예)를 MongoDB를 GridFS에 파일을 저장할 수있는 방법 io.Writer을 구현하므로 파일 내용을 mgo.GridFile으로 "스트리밍"합니다.io.Copy() 전화 :

// ... 
file, handler, err := r.FormFile("pdfFile") 

// ... 
mongoFile, err := db.GridFS("fs").Create("somepdf.pdf") 
check(err) 

// Now stream from HTTP request into the mongo file: 
written, err := io.Copy(mongoFile, file) 
// Handle err 

err = mongoFile.Close() 
check(err) 

편집 : 업데이트가 갱신

대답 당신은 PDF를 제공 할 때, 당신은 잘못된 방법으로 문서를 조회 :

err := coll.Find(bson.M{"_id": bson.ObjectIdHex(incomingId)}). 
    Select(bson.M{"pdf": 1}).One(&school) 

당신은 pdf 필드를 선택 하지만 MongoDB의 문서에는 해당 필드가 없습니다.

type dbSchool struct { 
    ID bson.ObjectId `json:"id" bson:"_id,omitempty"` 
    ... 
    Pdfdata []byte `json:"pdf"` 
    ... 
} 

이 형식 정의는 pdfdata 필드를 갖지만 pdf 필드는 갖지 않습니다.

type dbSchool struct { 
    ID bson.ObjectId `json:"id" bson:"_id,omitempty"` 
    ... 
    Pdfdata []byte `json:"pdf" bson:"pdf"` 
    ... 
} 

또는 pdf에서 pdfdata 선택한 필드를 변경 : 적절한 mgo 구조체 태그를 추가합니다.

+0

안녕하세요 @icza, 작동했습니다! 한가지 더 질문 : 이제 구조체 객체에서 바이트 데이터를 얻었습니다. 다음 단계는이 데이터를 pdf 파일로 변환하고 사용자가 웹 브라우저를 통해 다운로드 할 수있게하는 것입니다. 그걸 도울 수 있니? –

+0

@NikhilJoshi 시작을 위해이 질문을 확인하십시오. [PDF 다운로드가 golang의 서버 측에서 작동하지 않습니다.] (https://stackoverflow.com/questions/41238407/pdf-download-is-not-working-from-serverside-in- 골란). – icza

+0

Hello @icza, 시도했지만 완전히 작동하지 않습니다. 원래 게시물의 UPDATE를 참조하십시오. –