如何在Strapi自定义上传插件中获取完整文件路径?
解决Strapi自定义上传插件获取文件夹名称路径的问题
Strapi传递的folderPath和folder字段都是文件夹的ID(或ID层级路径),而非名称。要获取完整的名称路径,你需要通过Strapi的内置查询服务,递归查询upload::folder模型来拼接出名称组成的路径。
实现步骤:
- 编写递归函数获取完整文件夹名称路径
在自定义上传插件中添加递归查询函数,通过文件夹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; };
- 在上传逻辑中转换路径
在处理文件上传的核心代码里,解析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上传逻辑,可将文件上传至对应名称路径下 // ... };
- 注意事项
- 确保插件有权限访问
upload::folder模型,Strapi默认配置允许内部插件访问,若遇权限问题需在插件权限配置中添加对应权限。 - 若文件夹层级较深,可添加缓存逻辑优化递归查询的性能,避免重复查询相同文件夹信息。
补充说明
Strapi v4版本中,媒体库文件夹存储在upload_folders数据库表中,每条记录包含id(文件夹ID)、name(文件夹名称)、parent_id(父文件夹ID)字段,通过这些字段可完整构建文件夹的层级结构。
内容的提问来源于stack exchange,提问作者Ivan Garcia
相关产品推荐
相关产品推荐

