我可以通过 golang 中的 http.FileServer 提供存储在 Google Cloud Storage 中的文件吗?

问题描述

我开发了一个在 golang 中运行 web 服务器的小型 web 应用程序。 每个用户都可以登录,查看他们的文档列表(之前上传的)并点击一个项目来查看一个 html 页面,该页面显示了文档的一些字段以及一个带有 src 属性标签

src 属性包含一个 url,如“mydocuments/download/123-456-789.pdf”

在服务器端,我通过 http 处理程序处理 URL(“mydocuments/download/*”)

mymux.HandleFunc(pat.Get("/mydocuments/download/:docname"),DocDownloadHandler)

哪里:

  1. 我检查用户是否有权查看 url 中的文档
  2. 然后我创建了一个文件服务器,显然将 url 重新映射到文件存储在服务器文件系统上的文件夹的真实路径
fileServer := http.StripPrefix("/mydocs/download/",http.FileServer(http.Dir("/the-real-path-to-documents-folder/user-specific-folder/)))

当然还有我提供文件

fileServer.ServeHTTP(w,r)

重要提示:存放文件的目录不是我为网站申请的static-files目录,而是用户上传后所有文件结束的目录。

我的问题 当我尝试将代码转换在 Google Cloud 上运行时,我正在尝试更改代码,以便将文件存储在存储桶中(或者,更好地存储在“子目录”中 -因为它们没有正确存在 - 一个桶)。

如何修改代码,以便通过云存储桶映射可用的真实文档 url? 我还可以使用上面的 http.FileServer 技术吗(如果可以,我应该使用什么代替 http.Dir 来映射存储文档的存储桶“子文件夹”路径)?

我希望我已经足够清楚地解释了我的问题... 对于任何不清楚的地方,我提前道歉......

解决方法

一些选项是:

  1. 允许用户使用签名 URL 直接访问资源。
    编写代码将请求代理到 GCS。
    http.FS 与由 GCS 支持的 fs.FS 一起使用。

可能已经存在 GCS 的 fs.FS,但您可能需要编写一个。

  1. 您可以使用 http.FileSystem,因为它是一个接口,可以随心所欲地实现。