上传到 GCP 存储或使用 bucket.getFiles() 后将文件名保存在数据库中
Saving filename in DB after uploading to GCP Storage or using bucket.getFiles()
我一直在Whosebug 上搜索,但似乎还没有人问过这个问题。这是一个关于文件上传到 GCP 存储的架构问题。
TL;DR:直接(从服务器)使用 bucket.getFiles() 是否有任何问题,而不是将每个文件名存储在我的数据库中,然后一个一个地询问它们 return 将数组发送给客户端?
情况:
我正在开发一项功能,允许用户上传图像附件 linked 到送货单。此交货单可以有多个附件。
我在客户端(移动设备)上使用一个简单的上传按钮,将 GCP 中的内容上传到 path/to/id-deliveryNote
文件夹中,例如:path/to/id-deliveryNote/filename.jpg
path/to/id-deliveryNote/filename2.jpg
等...
用户应该能够在应用程序的其他地方单击并下载每个附件。
解决方法
在 GCP 中完成上传后,我问自己如何读取这些文件并让用户下载 link 文件。就在那时我找到了:bucket.getFiles()
函数。
因为我的文件路径都在相同的 id-deliveryNote/
前缀之下,我利用了 bucket.getFiles(prefix)
的用法,并且在 promise resolve 可以安全地 return 到我的用户列表之后link可用。
问题
我没有将文件名存储在我的数据库中的 deliveryNote table 中。这听起来有点问题,依靠 GCP 了解一份交货单的附件。我的看法是,以我的方式,我不需要在我们的数据库中复制信息(并且可能在两个位置处理故障),如果我需要这些文件,我会要求 GCP 给我他们的 link秒。相反的想法是,存储名称,您将能够为客户列出附件,然后在用户单击特定附件时生成下载 link。
我的问题是:直接(从服务器)使用 bucket.getFiles() 是否有任何问题,而不是将每个文件名存储在我的数据库中,然后一个一个地询问它们 return 将数组发送给客户端?
可能影响所选方法的几点:
- 每次通话的 GCP 成本差异?
- 无效的应用程序数据结构?
- 其他事情?
使用此方法 return link 下载文件没有问题。在该方法的 API 文档中 - 可访问 here - they even show an example of returning files using prefixes as well. You just need to look out that Cloud Storage actually doesn't use real folders and only names that look like they are in folders - more details in this case - 因此您在使用名称和前缀时不会混淆概念。
对于定价点,您可以在 this documentation 中获得 Google Cloud Storage 的全部定价,包括每个操作的成本——例如,每 50000 美元将花费 0.02 美元对象获取操作、检索存储桶和对象元数据 - 存储数据等。检查之后,您还可以与数据库成本进行比较,以检查这一点是否会影响您。
总而言之,你按照这个是没有问题的。将名称存储在数据库中的好处实际上是,即使您可能在两个地方出现故障,但您更有可能只在一个地方遇到问题,这样复制将是一件很棒的事情。所以,你只需要决定哪一个最适合你。
我一直在Whosebug 上搜索,但似乎还没有人问过这个问题。这是一个关于文件上传到 GCP 存储的架构问题。
TL;DR:直接(从服务器)使用 bucket.getFiles() 是否有任何问题,而不是将每个文件名存储在我的数据库中,然后一个一个地询问它们 return 将数组发送给客户端?
情况:
我正在开发一项功能,允许用户上传图像附件 linked 到送货单。此交货单可以有多个附件。
我在客户端(移动设备)上使用一个简单的上传按钮,将 GCP 中的内容上传到 path/to/id-deliveryNote
文件夹中,例如:path/to/id-deliveryNote/filename.jpg
path/to/id-deliveryNote/filename2.jpg
等...
用户应该能够在应用程序的其他地方单击并下载每个附件。
解决方法
在 GCP 中完成上传后,我问自己如何读取这些文件并让用户下载 link 文件。就在那时我找到了:bucket.getFiles()
函数。
因为我的文件路径都在相同的 id-deliveryNote/
前缀之下,我利用了 bucket.getFiles(prefix)
的用法,并且在 promise resolve 可以安全地 return 到我的用户列表之后link可用。
问题
我没有将文件名存储在我的数据库中的 deliveryNote table 中。这听起来有点问题,依靠 GCP 了解一份交货单的附件。我的看法是,以我的方式,我不需要在我们的数据库中复制信息(并且可能在两个位置处理故障),如果我需要这些文件,我会要求 GCP 给我他们的 link秒。相反的想法是,存储名称,您将能够为客户列出附件,然后在用户单击特定附件时生成下载 link。
我的问题是:直接(从服务器)使用 bucket.getFiles() 是否有任何问题,而不是将每个文件名存储在我的数据库中,然后一个一个地询问它们 return 将数组发送给客户端?
可能影响所选方法的几点:
- 每次通话的 GCP 成本差异?
- 无效的应用程序数据结构?
- 其他事情?
使用此方法 return link 下载文件没有问题。在该方法的 API 文档中 - 可访问 here - they even show an example of returning files using prefixes as well. You just need to look out that Cloud Storage actually doesn't use real folders and only names that look like they are in folders - more details in this case
对于定价点,您可以在 this documentation 中获得 Google Cloud Storage 的全部定价,包括每个操作的成本——例如,每 50000 美元将花费 0.02 美元对象获取操作、检索存储桶和对象元数据 - 存储数据等。检查之后,您还可以与数据库成本进行比较,以检查这一点是否会影响您。
总而言之,你按照这个是没有问题的。将名称存储在数据库中的好处实际上是,即使您可能在两个地方出现故障,但您更有可能只在一个地方遇到问题,这样复制将是一件很棒的事情。所以,你只需要决定哪一个最适合你。