当前位置: 首页 > 面试题库 >

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

乐正迪
2023-03-14
问题内容

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

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

这是我的Go代码的片段:

func uploadfilePageHandler(w html" target="_blank">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))?
  • 如果是这样,我可以更有效地执行此步骤吗?
  • 我应该考虑其他可接受的做法或方法吗?

谢谢…


问题答案:

不,您不应该一次在内存中完全读取文件,因为当文件太大时,这会中断。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)

至于为什么它比其他东西慢,在不深入研究所使用的两种方法的细节的情况下很难说出来。



 类似资料:
  • 问题内容: 我试图了解如何使用Node.js在Firebase Storage中上传文件。我的第一次尝试是使用Firebase库: 但是事实证明,Firebase无法从服务器端上传文件,正如在文档中明确指出的那样: Firebase存储不包含在服务器端Firebase npm模块中。相反,您可以使用gcloud Node.js客户端。 在代码中,您可以使用以下方式访问存储分区: 我们可以在没有Go

  • 我从一个网址读取图像并处理它。我需要将这些数据上传到云存储中的一个文件中,目前我正在将这些数据写入一个文件,并上传该文件,然后删除该文件。有没有办法把数据直接上传到云端仓库?

  • 我正在Windows服务器上使用C#处理存储在IIS服务器上的web应用程序。 null

  • 问题内容: 我正在编写一个简单的部署工具,该工具需要从s3中获取tar文件,然后将其解压缩,然后将其上传到我们的登台服务器。我想这样做而不将文件存储在本地,而是将它们保存在内存中。 这是我的代码,用于从s3下载文件 我想避免在此示例中创建目录和文件,而只是将所有内容保留在内存中。我省去了从代码中提取文件的步骤。下一步将使用go- scp 上传文件,如下所示: 然后,我的问题将集中在这段代码的一部分

  • 问题内容: 我读过多个有关使用mgo保存文件的博客,但找不到满足特定需求的解决方案,请大声喊叫! 下面在MongoDb中插入对象: 下面能够保存文件: 现在,在插入对象之前,我需要将上述文件设置为: 我的结构对象: 用外行术语来说,问题是:如何使用mgo驱动程序通过GoLang结构在mongoDb中插入文件(从HTML表单接收)? 谢谢阅读!:) 更新: PDF存储在MongoDB中,如下所示:

  • 我尝试用以下代码保存从internet下载的文件 但在运行时,我得到的错误如下 03-04 20:42:51.080 8972-8972/com.example.me.demo2 E/BitmapFactory:无法解码流:java.io.FileNotFoundExcoop: /storage/emulated/0/.tanks/4a100abb-0e55-4062-8c37-f11f4189e