Strapi, как использовать сервис загрузки с другим полем, чем «файлы» - PullRequest
0 голосов
/ 01 ноября 2019

сторонняя библиотека для загрузки изображений (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".

...