首页 > 解决方案 > 我可以通过 golang 中的 http.FileServer 提供存储在 Google Cloud Storage 中的文件吗?

问题描述

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

src 属性包含类似“mydocuments/download/123-456-789.pdf”的 url

在服务器端,我通过 http Handler 处理 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)

重要提示:存储文档的目录不是我为网站申请的静态文件目录,而是所有文件在用户上传后结束的目录。

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

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

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

标签: gogoogle-cloud-storage

解决方案


一些选项是:

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

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

  1. 您可以使用http.FileSystem,因为它是一个接口,可以根据您的喜好实现。

推荐阅读