Как изменить размер изображения с помощью sharp, а затем загрузить его с помощью multer в nodejs - PullRequest
0 голосов
/ 01 декабря 2018

Я разрабатываю функцию, позволяющую пользователю загружать изображение в mongodb с помощью nodejs:

  • Моя проблема:

    Получить файл изображения по запросу пользователя и выполнить 2 задачи: сохранить текущее изображение в mongodb, например, с именем коллекции «Origin_image», изменить размер текущего изображения и сохранить в mongodb с именем коллекции «Thumbnail_image»

  • Мое решение на данный момент:

    Я только сохраняю исходное изображение с успехом, используя multer-gridfs-storage и multer-подобный код ниже

    const multer = require ('multer');const GridFsStorage = require ('multer-gridfs-storage');

    const multer = require ('multer');const GridFsStorage = require ('multer-gridfs-storage');

            let storageFS = new GridFsStorage({
                db: app.get("mongodb"),
                file: (req, file) => {
                    return new Promise((resolve, reject) => {
                        crypto.randomBytes(16, (err, buf) => {
                            if (err) {
                                return reject(err);
                            }
                            const filename = file.originalname;
                            const fileInfo = {
                                filename: filename,
                                bucketName: 'images'
                            };
                            resolve(fileInfo);
                        });
                    });
                }
            });
    
        var upload = multer({ storage: storageFS }).single('image');
    
        exports.uploadImage = async function (req, res) {
        try {
            upload(req, res, function (err) {
                if (err) {
                    return res.send(err)
                }
                res.json({
                    status: true,
                    filePath: req.file.originalname
                });
            });
        } catch (error) {
            res.send(error);
        }
    }
    

У кого-нибудь есть идеи для решения моей проблемы?спасибо!

1 Ответ

0 голосов
/ 23 декабря 2018

Если вы используете Angular на своем веб-интерфейсе, пусть конечный пользователь обрабатывает изменение размера изображения, чтобы вашему серверу не приходилось справляться с накладными расходами.В настоящее время я использую ng2-img-max для изменения размера изображений.Вы можете инициировать изменение размера, как при изменении файла.

Я также хотел иметь миниатюры, а затем оригинал, но это вызвало огромную проблему с производительностью при изменении размера обоих, а затем снова, как связать их, поскольку GridFs хранит их довы можете делать с ними все что угодно, и все, что у вас есть, это ответ.Так что сэкономьте время.Измените размер только один раз, до вашего ограниченного размера для пользователя, а затем для отображения миниатюрных изображений используйте sharp с пользовательскими параметрами запроса, чтобы отобразить нужный размер.

Удачи и удачного кодирования.

...