Custom Multer storage - недопустимая операция при использовании Sharp

Я использую Multer вместе с Sharp для хранения изображений, загруженных как часть формы HTML. Я хочу изменить размер и трансформировать изображения, прежде чем сохранять их на диске, и нашел эту ветку о том, как это сделать.

Я думал, что все настроил правильно, но когда я пытаюсь загрузить изображение, я получаю:

Ошибка: EISDIR: недопустимая операция с каталогом, откройте "C:\...\uploads"

Ниже мой код:

Routes.js:

var multer = require('multer');
var customStorage = require(path.join(__dirname, 'customStorage.js'));

var upload = multer({
    storage: new customStorage({
        destination: function (req, file, cb) {
            cb(null, path.join(__dirname, 'uploads'));
        },
        filename: function (req, file, cb) {
            cb(null, Date.now());
        }
    }),
    limits: { fileSize: 5000000 }
});
...
app.use('/upload', upload.single('file'), (req, res) => { ... });

customStorage.js:

var fs = require('fs');
var sharp = require('sharp');

function getDestination (req, file, cb) {
    cb(null, '/dev/null'); // >Implying I use loonix
};

function customStorage (opts) {
    this.getDestination = (opts.destination || getDestination);
};

customStorage.prototype._handleFile = function _handleFile(req, file, cb) {
    this.getDestination(req, file, function (err, path) {
        if (err) return cb(err);

        var outStream = fs.createWriteStream(path);
        var transform = sharp().resize(200, 200).background('white').embed().jpeg();

        file.stream.pipe(transform).pipe(outStream);
        outStream.on('error', cb);
        outStream.on('finish', function () {
            cb(null, {
                path: path,
                size: outStream.bytesWritten
            });
        });
    });
};

customStorage.prototype._removeFile = function _removeFile(req, file, cb) {
    fs.unlink(file.path, cb);
};

module.exports = function (opts) {
    return new customStorage(opts);
};

1 ответ

Решение

Ошибка Ошибка: EISDIR: недопустимая операция с каталогом в этом контексте означает, что вы устанавливаете в качестве пункта назначения Multer каталог, когда оно должно быть именем файла назначения.

Пункт назначения указан в строке cb(null, path.join(__dirname, 'uploads')); в Routes.js. Если вы измените эту строку на что-то вроде cb(null, path.join(__dirname, 'myDirectory\\mySubdirectory\\', myFilename + '.jpg')), это будет работать.

Другие вопросы по тегам