我有一个使用Cloud SQL存储数据的Google Cloud Endpoints。我想为客户端提供文件上传,文件应该存储在云存储中,但我也想在Cloud SQL中存储文件元数据和文件存储URL。
最好的做法是什么?
我可以通过云端点上传文件,还是需要额外的上传Servlet?
如何更新需要引用上传文件的数据库实体。
有关如何组合这3种技术的任何示例?
答案 0 :(得分:0)
假设您的客户未添加到您的Google云项目中(通常就是这种情况),您的用户将无权使用您的GCS存储桶。您可以将文件提交到您的应用程序并从那里移动到GCS(不建议消耗更多的网络和CPU),或者更好的方法是直接提交给GCS。
要让客户端直接写入您的GCS存储桶,您需要: 1.如果客户端由有限的受信任人使用,则将您的访问密钥放在客户端上以进行写访问(不推荐)。 2.生成一个有时间限制的令牌,并将其作为签名URL直接上传到客户端。
端点API本身无法执行此操作,但您可以在服务器上生成签名的GCS URL,并使用客户端上的端点获取它。然后将其设置为表单操作(在Web客户端上,其他客户端具有类似的签名上载方式)并提交表单以上载文件。
<form action="SIGNED_URL_FROM_ENDPOINTS" method="post" enctype="multipart/form-data">
我没有看到开源代码正是这样做的,但最接近的是this project that does generate the signed URL with a time-out (the only unintuitive part)。
更新数据库中元数据的最佳方法是watch GCS bucket using 'Object Change Notifications'。另一种方法是从客户端本身向服务器发送元数据,这可以是端点调用。您甚至可以在文件上传之前使用端点将元数据混合到服务器,并且通知会更新记录并确认可以提供服务。