如何使用curl上传到Supabase存储?

tan*_*ius 5 rest curl file-upload supabase

我看到了所有客户端库将文件上传到Supabase Storage的示例和手册,但没有关于普通 HTTP 协议的完整信息(例如,使用curl)。

Supabase Storage API 参考手册Supabase Storage API Swagger UI 文档都详细描述了 API,但遗漏了一个重要细节:要使用的基本 URL。

tan*_*ius 6

您需要什么:

  1. 您创建了一个存储桶。使用其名称代替{bucket}下面的名称。
  2. 您为表创建了一个 RLS 策略storage.objects,允许对经过身份验证的用户进行 INSERT。
  3. 您手头有项目的参考 ID。当托管在 supabase.com 上时,这是用于所有 API 请求的 URL 的子域部分。使用它代替{ref}下面的内容。
  4. 您拥有项目的匿名角色 API 密钥。使用它而不是{anon-key}下面的。
  5. 您的用户拥有当前有效的 JWT 令牌。使用它代替{bearer-auth-token}下面的内容。
  6. 您有一个要上传的文件,其绝对路径如/path/to/file.ext. 使用该绝对路径代替{path-and-filename.ext}下面,并使用文件名和扩展名代替下面{filename.ext}

现在,一个有效的上传命令将如下所示:

卷曲\
  -X POST "https:// {ref} .supabase.co/storage/v1/object/ {bucket} / {filename.ext} " \
  --data-binary "@ {路径和文件名.ext} " \
  -H“apikey:{匿名密钥} ”\
  -H“授权:承载{bearer-auth-token}

笔记:

  • URL 路径必须以storage/v1/. 这是我必须测试/逆向工程的部分。该手册仍然提到apiv0/,这已经过时了,并且也没有提到storage/前缀。Swagger UI 文档既没有提到storage/也没有提到v1/,但两者都是必需的。

  • 在请求 URL 中,https://{ref}.supabase.co/storage/v1/object/{bucket}/{filename.ext}您实际上可以设置{filename.ext}为任何带有扩展名的文件名,您希望使用该文件名在服务器端保存文件。它不必与文件的本地文件名相同。您甚至可以包含任何您喜欢的路径。

  • 成功后,结果将是一个 JSON 对象{"Key": "{bucket}/{filename.ext}"},其中包含您在请求 URL 中使用的值。这是当您要下载、移动文件等时识别上传文件服务器端的关键。

  • 由于路径和文件名是识别文件的关键,因此尝试将具有相同路径和文件名的文件上传到同一个存储桶中将会导致错误{"statusCode": "409", "error": "Duplicate", "message": "The resource already exists"}