You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从Supabase存储桶删除文件,返回data: []问题求助

Supabase存储桶文件删除失败,返回data: []的解决方法

问题描述

我在Supabase的video_course_presentation存储桶中配置了两条策略,目前可以正常向该桶保存文件,但调用删除接口时返回data: [],无法删除目标文件。代码如下:

const deleteVideoFromBucket = async(videoFile) => {
    const videoFilePath = videoFile.split('/').pop();
    console.log(videoFilePath)
    try {
        const { data, error } = await supabase
        .storage
        .from('video_course_presentation')
        .remove([`${videoFilePath}`])
        console.log('return', data, error)
        if(data && data.length > 0) {
            videoDeletedFromBucketToaster();
        }

    } catch (err) {
        console.log('There was an error deleting the video file from the bucket ', err);
    }
}

排查与解决方案

1. 修正文件路径提取逻辑

你当前通过split('/').pop()仅提取文件名,但如果文件存储在桶的子文件夹中,仅传文件名会导致Supabase找不到目标文件。比如原文件路径是subfolder/video.mp4,只传video.mp4会匹配不到。

解决方式:
如果videoFile是Supabase返回的完整文件URL(如https://xxx.supabase.co/storage/v1/object/public/video_course_presentation/subfolder/video.mp4),可以通过截取URL中存储桶名称后的部分来获取正确路径:

const deleteVideoFromBucket = async(videoFile) => {
    // 替换掉URL中的存储桶公共访问前缀
    const bucketPublicPrefix = `${supabaseUrl}/storage/v1/object/public/video_course_presentation/`;
    const videoFilePath = videoFile.replace(bucketPublicPrefix, '');
    console.log('正确文件路径:', videoFilePath)
    try {
        const { data, error } = await supabase
        .storage
        .from('video_course_presentation')
        .remove([videoFilePath])
        console.log('return', data, error)
        if(data && data.length > 0) {
            videoDeletedFromBucketToaster();
        }

    } catch (err) {
        console.log('删除文件出错:', err);
    }
}

2. 检查存储桶删除策略权限

虽然上传正常,但删除策略可能存在配置问题:

  • 登录Supabase控制台,进入Storage -> 目标存储桶 -> Policies,查看删除策略的配置:
    • 确保策略的动作是DELETE,且USING条件允许当前用户操作(比如测试阶段可以暂时设置USING (true)来开放删除权限,确认后再调整为符合安全要求的条件,如auth.id() = metadata->>'owner_id')。
    • 示例测试策略:
      CREATE POLICY "临时允许所有用户删除" ON storage.objects
      FOR DELETE USING (bucket_id = 'video_course_presentation');
      

3. 先验证文件是否存在

在调用删除接口前,先通过list方法确认文件是否存在于桶中,路径是否正确:

const { data: fileList } = await supabase.storage.from('video_course_presentation').list('', {
  search: videoFilePath
});
console.log('匹配到的文件:', fileList);

如果返回空数组,说明路径错误,需要重新调整路径提取逻辑。

4. 确认客户端初始化与用户认证状态

  • 确保Supabase客户端初始化时使用了正确的supabaseUrl和supabaseKey。
  • 如果删除策略要求用户认证,要确保当前用户已经通过supabase.auth.signIn等方法完成登录,未认证用户无法触发需要权限的策略。

内容的提问来源于stack exchange,提问作者Richi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 09:07:16