сторонняя библиотека для загрузки изображений (CKEditor - Simple Upload Adapter).
Сторонняя библиотека отправляет запрос на публикацию с именем поля, отличным от " files ".
Также мне нужно изменить ответ по умолчанию для загрузки, чтобы CKEditor мог работать с этим.
Ответ должен быть следующим:
{ "url": 'http://localhost:3001/myimage.jpg'}
Что я пробовал: Созданпользовательский сервис загрузки изображений, который использует @ koa / multer для хранения файлов. Однако там всегда есть временная папка, и я не могу изменить ее в качестве лучшего места назначения.
При использовании koajs с multer без strapi я могу изменить место назначения, только при использовании с strapi путь является временной папкой. Смотрите этот репозиторий здесь: https://github.com/kolomu/koajs-example-server-multer
Как воспроизвести мою проблему: Используйте этот HTML-файл:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="http://localhost:1337/customupload" method="POST" enctype="multipart/form-data">
<input type="file" name="upload" />
<button type="submit">send</button>
</form>
</body>
</html>
Создайте пользовательский сервис MyUpload.js
var multer = require('@koa/multer');
const path = require('path');
const storage = multer.diskStorage({
destination: function (req, file, cb) {
console.log('in dest');
cb(null, path.resolve(__dirname, './public'));
},
filename: function (req, file, cb) {
console.log('in filename');
let fileName = file.originalname.toLowerCase();
let fileExtension;
if (fileName.endsWith('.jpg')) {
fileExtension = '.jpg';
} else if (fileName('.png')) {
fileExtension = '.png'
}
cb(null, file.fieldname + '-' + Date.now() + fileExtension)
}
});
const upload = multer({ storage: storage });
module.exports = {
imgUpload: (ctx) => {
console.log('in imgUpload!');
console.log('ctx');
console.log(ctx)
upload.single('upload')(ctx, () => {
console.log('ctx.request.files', ctx.request.files);
console.log('ctx.files', ctx.files);
ctx.body = 'done';
});
}
};
Создайте контроллер:
'use strict';
module.exports = {
handleUpload: async ctx => {
strapi.services.myupload.imgUpload(ctx);
ctx.send('Hello World!' + JSON.stringify(ctx));
},
};
Создайте соответствующий маршрут:
{
"routes": [
{
"method": "POST",
"path": "/customupload",
"handler": "Custom.handleUpload",
"config": {
"policies": []
}
}
]
}
Теперь при загрузке файла вы увидите в журнале узлов, что путь - это локальная временная папка вместо "public ".
Другой подход: Так что я подумал, что другим способом было бы создать пользовательский поставщик загрузки. Однако при использовании стандартной процедуры загрузки имя поля также должно быть "files".