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

问题描述 投票:0回答:2

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

curl
)。

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

rest curl file-upload supabase
2个回答
6
投票

您需要什么:

  1. 您创建了一个存储桶。使用其名称代替下面的
    {bucket}
  2. 您为表
    storage.objects
    创建了一个 RLS 策略,允许对经过身份验证的用户执行 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"}


0
投票

您发布的解决方案适用于将文件上传到存储。然而,当我尝试对图像执行此操作时,它会上传到存储,但最终存储的文件中存在一些错误,这使得图像无法查看。我想这是我的语法问题。

您可以帮我修复此实现,以在文件上传中包含图像吗?

这是我正在使用的代码(form?.image_file 是 HTML 文件上传,我在提交之前将 .png 上传到表单中):

        imageFile = form?.image_file;


        let timestamp = Date.now();

        console.log(imageFile);

    let file = {
        path: `public/${timestamp}.png`,
        fileBody: imageFile
    }

  const response = await fetch(`${process.env.SUPABASE_URL}/storage/v1/object/images/public/${timestamp}.png`, 
  {
    method: 'POST',
    headers: {
        'Content-Type': 'image/png',
        'apikey': process.env.SUPABASE_API_KEY,
        'Authorization': `Bearer ${process.env.SUPABASE_API_KEY}`,
    },
    body: file
    })

    let res = await response.json();
    
    console.log(res);
© www.soinside.com 2019 - 2024. All rights reserved.