Strapi上传到本地私有路径

let*_*ome 6 strapi

我正在将 Strapi 与本地上传提供商一起使用。

每当我上传文件时,它都会存储在本地的“public/uploads”文件夹下,该文件夹是公共的。

这意味着任何拥有该文件 ID 的人都可以下载它,例如。http://strapi-admin:1337/uploads/image1_9a9bd50a5b.png

但是,我只想允许:

  • 下载给经过身份验证的用户,这些用户具有“消费者”角色,能够通过 Strapi API 下载文件。

这样做的最佳方法是什么?

我应该直接修改上传扩展名吗?或者我可以用什么解决方法来实现这个?

我仍然想在本地存储文件(不使用 AWS3 和其他云提供商)

谢谢

zig*_*aba 1

解决此问题的最佳方法是创建一个集合,例如 FileShare。Collection表可以是这样的:uuid(UID),文件名(TEXT),fileid(NUMBER),角色(与角色表相关),用户(与用户权限表相关),状态(BOOLEAN)。

使用此逻辑,您将必须创建一个新的文件上传路径,从相应的控制器上传代码,下面的代码将有所帮助:

    const validateUploadBody = require('strapi-plugin-upload/controllers/validation/upload');
                async create(ctx){
             let userData=ctx.state?.user; let requestData=ctx.request.body;
         const {
                    request: { body, files: { files } = {} },
                  } = ctx;
          let uploadedFiles = await strapi.plugins.upload.services.upload.upload({
                data: await validateUploadBody(body),
                files,
              });
     let datat={
                filename:uploadedFiles[0].name,
                fileid:uploadedFiles[0].id,
                status:true,
                uuid:"3456345678", // Generate random perhaps use moment().format("x")
                role:2 //it can be any role of your choice
                                    }
  let updateLibrary= await strapi.query('file-shares').create(datat); 
        
        }
Run Code Online (Sandbox Code Playgroud)

确保使用 uuid 作为前端的下载点,例如https://example.com/file/2343567。不要暴露您的媒体库网址。

然后创建一个控制器,该控制器将从 FileShare 表中查找文件,检查用户的必要权限,然后下载文件。