#strapi
#strapi
Вопрос:
Я использую Strapi с локальным поставщиком загрузки.
Всякий раз, когда я загружаю файл, он хранится в локальной папке «public / uploads», которая является общедоступной.
Это означает, что любой, у кого есть идентификатор файла, может загрузить его, например. http://strapi-admin:1337/uploads/image1_9a9bd50a5b.png
Тем не менее, я хотел бы разрешить только:
- загружается аутентифицированным пользователям, у которых есть роль «потребитель», чтобы иметь возможность загружать файлы через API strapi.
Каков наилучший способ для этого?
Должен ли я изменять расширение загрузки напрямую? или это какой-либо обходной путь, который я могу использовать для реализации этого?
Я все равно хотел бы хранить файлы локально (не используя AWS3 и других облачных провайдеров)
Спасибо
Ответ №1:
Лучший способ решить эту проблему — создать коллекцию, например, файловый ресурс. Таблица сбора может быть такой: uuid (UID), имя файла (ТЕКСТ), идентификатор файла (НОМЕР), роль (связанная с таблицей ролей), пользователь (связанный с таблицей разрешений пользователя), статус (ЛОГИЧЕСКОЕ значение).
Используя эту логику, вам нужно будет создать новый маршрут для загрузки файлов, выгрузки кода с соответствующего контроллера, приведенный ниже код поможет:
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);
}
Убедитесь, что вы используете uuid в качестве точки загрузки из вашего интерфейса, например https://example.com/file/2343567 . Не предоставляйте URL-адрес своей медиа-библиотеки.
Затем создайте контроллер, который будет искать файл из таблицы FileShare, проверьте необходимые разрешения для пользователя, а затем загрузите файл.