我看到了所有客户端库将文件上传到 Supabase Storage 的示例和手册,但没有纯 HTTP 协议的完整信息(例如,使用
curl
)。
Supabase Storage API 参考手册和Supabase Storage API Swagger UI 文档详细描述了 API,但遗漏了一个重要细节:要使用的基本 URL。
您需要什么:
{bucket}
。storage.objects
创建了一个 RLS 策略,允许对经过身份验证的用户执行 INSERT。{ref}
。{anon-key}
。{bearer-auth-token}
。/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"}
。
您发布的解决方案适用于将文件上传到存储。然而,当我尝试对图像执行此操作时,它会上传到存储,但最终存储的文件中存在一些错误,这使得图像无法查看。我想这是我的语法问题。
您可以帮我修复此实现,以在文件上传中包含图像吗?
这是我正在使用的代码(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);