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

如何在Strapi自定义上传插件中获取完整文件路径?

解决Strapi自定义上传插件获取文件夹名称路径的问题

Strapi传递的folderPath和folder字段都是文件夹的ID(或ID层级路径),而非名称。要获取完整的名称路径,你需要通过Strapi的内置查询服务,递归查询upload::folder模型来拼接出名称组成的路径。

实现步骤:

  1. 编写递归函数获取完整文件夹名称路径
    在自定义上传插件中添加递归查询函数,通过文件夹ID向上追溯父文件夹,最终拼接出完整的名称路径:
// 递归查询文件夹完整名称路径
const getFolderNamePath = async (strapi, folderId) => {
  if (!folderId) return '';

  // 查询当前文件夹的名称和父ID
  const folder = await strapi.db.query('upload::folder').findOne({
    where: { id: folderId },
    select: ['name', 'parentId'],
  });

  if (!folder) return '';

  // 递归获取父文件夹路径
  const parentPath = await getFolderNamePath(strapi, folder.parentId);
  // 拼接当前文件夹名称
  return parentPath ? `${parentPath}/${folder.name}` : folder.name;
};
  1. 在上传逻辑中转换路径
    在处理文件上传的核心代码里,解析folderPath中的ID列表,调用上述函数转换为名称路径:
// 示例上传处理函数
const uploadToS3 = async (file, options) => {
  // 拆分folderPath中的ID,比如 "/1/2" 转为 [1,2]
  const folderIds = file.folderPath.slice(1).split('/').filter(Boolean);
  let fullNamePath = '';

  if (folderIds.length > 0) {
    // 获取最底层文件夹的完整名称路径
    fullNamePath = await getFolderNamePath(strapi, folderIds[folderIds.length - 1]);
  }

  // 此时fullNamePath即为名称组成的路径,比如 "旅行照片/2024夏季"
  console.log('完整文件夹名称路径:', fullNamePath);

  // 后续执行S3上传逻辑,可将文件上传至对应名称路径下
  // ...
};
  1. 注意事项
  • 确保插件有权限访问upload::folder模型,Strapi默认配置允许内部插件访问,若遇权限问题需在插件权限配置中添加对应权限。
  • 若文件夹层级较深,可添加缓存逻辑优化递归查询的性能,避免重复查询相同文件夹信息。

补充说明

Strapi v4版本中,媒体库文件夹存储在upload_folders数据库表中,每条记录包含id(文件夹ID)、name(文件夹名称)、parent_id(父文件夹ID)字段,通过这些字段可完整构建文件夹的层级结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:02:45