gpt4 book ai didi

mongodb - 使用 mgo 将上传的文件存储在 MongoDB GridFS 中而不保存到内存

转载 作者:IT王子 更新时间:2023-10-29 00:50:30 25 4
gpt4 key购买 nike

菜鸟 Golang 和 Sinatra 人在这里。我破解了一个 Sinatra 应用程序以接受从 HTML 表单发布的上传文件,并通过 GridFS 将其保存到托管的 MongoDB 数据库中。这似乎工作正常。我正在使用 mgo 驱动程序在 Golang 中编写相同的应用程序。

功能上它工作正常。但是在我的 Golang 代码中,我将文件读入内存,然后使用 mgo 将文件从内存写入 MongoDB。这看起来比我的等效 Sinatra 应用程序慢得多。我感觉 Rack 和 Sinatra 之间的交互不会执行这个“中间”或“临时”步骤。

这是我的 Go 代码片段:

func uploadfilePageHandler(w http.ResponseWriter, req *http.Request) {
// Capture multipart form file information
file, handler, err := req.FormFile("filename")
if err != nil {
fmt.Println(err)
}

// Read the file into memory
data, err := ioutil.ReadAll(file)
// ... check err value for nil

// Specify the Mongodb database
my_db := mongo_session.DB("... database name...")

// Create the file in the Mongodb Gridfs instance
my_file, err := my_db.GridFS("fs").Create(unique_filename)
// ... check err value for nil

// Write the file to the Mongodb Gridfs instance
n, err := my_file.Write(data)
// ... check err value for nil

// Close the file
err = my_file.Close()
// ... check err value for nil

// Write a log type message
fmt.Printf("%d bytes written to the Mongodb instance\n", n)

// ... other statements redirecting to rest of user flow...
}

问题:

  • 是否需要这个“临时”步骤(data, err := ioutil.ReadAll(file))?
  • 如果是这样,我可以更有效地执行此步骤吗?
  • 我应该考虑其他公认的做法或方法吗?

谢谢...

最佳答案

不,您不应该一次完全读取内存中的文件,因为当文件太大时会中断。 documentation for GridFS.Create 中的第二个示例避免了这个问题:

file, err := db.GridFS("fs").Create("myfile.txt")
check(err)
messages, err := os.Open("/var/log/messages")
check(err)
defer messages.Close()
err = io.Copy(file, messages)
check(err)
err = file.Close()
check(err)

至于为什么它比其他方法慢,如果不深入研究所使用的两种方法的细节,很难说清楚。

关于mongodb - 使用 mgo 将上传的文件存储在 MongoDB GridFS 中而不保存到内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22159665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com