jquery - 使用 GoLang mgo 在 MongoDb 中保存 pdf

标签 jquery mongodb file go mgo

我阅读了多篇关于使用 mgo 保存文件的博客,但无法找到满足以下特定需求的解决方案,请大声疾呼!

下面在 MongoDb 中插入对象:

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

下面可以得到文件:

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

现在,在插入对象之前,我需要像这样设置上面的文件:

dbSchoolPojo.pdf = file.Bytes(); //Of course Bytes() is invalid method

我的结构对象:

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

通俗地说,问题是:如何使用 mgo 驱动程序通过 GoLang 结构在 mongoDb 中插入文件(从 HTML 表单接收)?

感谢阅读! :)


Update:

PDF 像下面这样存储在 MongoDB 中:

Binary('EWHKDSH876KJHlkjdswsddsfsd3232432njnjkn2dljDSFSDFIJSFD333...')

下面的代码没有错误,但不提供 PDF 文件:

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 代码:

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

最佳答案

Request.FormFile() 返回的文件类型为 multipart.File这是:

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

它实现了io.Reader ,所以你可以简单地阅读它的内容,例如与 ioutil.ReadAll() :

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

然后:

dbSchoolPojo.Pdfdata = data

但是将大文件作为文档的一部分存储并不是最优/高效的。相反,看看 MongoDB GridFS mgo 也支持:Database.GridFS() .

以下是如何在 MongoDB GridFS 中存储文件(示例取自 GridFS.Create() ):

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,如果您将文件内容“流”到 mgo.GridFile 中,您还可以保存文件而无需先将其所有内容读入内存。 , 因为它实现了 io.Writer .调用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。添加正确的 mgo 结构标签:

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

或者将所选字段从 pdf 更改为 pdfdata

关于jquery - 使用 GoLang mgo 在 MongoDb 中保存 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46784873/

相关文章:

javascript - 如何在需要时添加分页符

jquery - 从日期字段(mm/dd/yyyy)中减去天数,不包括周末jquery

node.js - 获取mongodb集合中的最大元素抛出异常

C编程: Error in writing values of a particular column from a file to another file

javascript - 反向灯箱效果

jquery - fullCalendar viewRender使用ajax无限循环

java - 从mongoDB复制数据到hdfs时hadoop jar错误

javascript - 在 MongoDB 中获取更新的文档

java - struts2不能检测文件内容? (重命名扩展麻烦)

c - 文件传输仅在服务器断开连接时完成