We need to create a folder for each user and store their files within it. Is it possible to do it in strapi v4 using media uploads

I solved this way, on my case, on top of the user level folder, I have a category folder, lets call it firstLevelFolder

example.file from user_123 would end up on

/firstLevelFolder/user_123/example.file

const uploadUserFilesService = async (fileArray, user) => {
  const uploadService = strapi.plugins.upload.services.upload;
  const folderService = strapi.plugins.upload.services.folder;

  // FIRST LEVEL FOLDER BLOCK
  let firstLevelFolderBase = await strapi.query('plugin::upload.folder').findOne({where: {name: 'firstLevelFolder'}});
  if (!firstLevelFolderBase) {
    await folderService.create({name: 'firstLevelFolder'})
    firstLevelFolderBase = await strapi.query('plugin::upload.folder').findOne({where: {name: 'firstLevelFolder'}});
  }

// USER LEVEL FOLDER BLOCK
  let userLevelFolder = await strapi.query('plugin::upload.folder').findOne({where: {name: user.username, parent: firstLevelFolderBase}});
  if (!userLevelFolder) {
    await folderService.create({name: user.username, parent: firstLevelFolderBase.id})
    userLevelFolder = await strapi.query('plugin::upload.folder').findOne({where: {name: user.username, parent: firstLevelFolderBase}});
  }


  // NOW LETS UPDATE THE FILES
  const uploadedFiles = await Promise.map(fileArray, async (file) => {
      return uploadService.upload({
        data: {
          path: `firstLevelFolder/${user.username}`,
          fileInfo: {folder: userLevelFolder.id},
        },
        files: file
      })
    }
  );
}
4 Likes