首页 > 解决方案 > 使用 Formidable 和 Jimp 上传多张图片

问题描述

我正在尝试使用强大的中间件将一些图像上传到我的节点后端。

我想从同一个表单上传多个文件。每个文件将存储在media/temp_files文件夹中,然后由 Jimp 处理为多个分辨率并存储在其分辨率的路径中;最后所有图像都应该返回到下一个中​​间件。但我不能,在将两张图片上传到临时文件夹后,它只处理并返回第一张图片。

我写了这个中间件formidable

var fs = require('fs');
var path = require('path');
var Jimp = require('jimp');
var mkdirp = require('mkdirp');

const formidable = require('formidable');
var fs = require('fs');

function parse(opts) {
    return (req, res, next) => {
        const form = new formidable.IncomingForm({
            uploadDir: 'media/temp_images',
            keepExtensions: true,
        });
        Object.assign(form, opts);

        form.on('file', function(field, file) {
            var date = new Date();

            var newName = date.getTime() + '.' + file.type.split('/')[1];
            var newPath = form.uploadDir + '/' + newName;
            fs.rename(file.path, newPath);
            file.path = newPath;
        });

        form.parse(req, (err, fields, files) => {
            var processImage = function(image, options) {
                options.sizes.map((item) => {
                    var clone = image.clone();
                    var uploadPath = path.join(options.folder, 'w' + item.width);
                    var filepath = path.join(uploadPath, options.name);
                    !fs.existsSync(uploadPath) && mkdirp.sync(uploadPath);
                    clone.resize(item.width, item.height).write(filepath);
                });
            };
            var promises = [];
            for (const file in files) {
                var options = {
                    sizes: [{ width: 100, height: 200 }, { width: 200, height: 400 }, { width: 600, height: 1200 }],
                    folder: path.join('media/images', file.toLowerCase()),
                    name: files[file].name,
                };

                var promise = new Promise((resolve, reject) => {
                    Jimp.read(files[file].path)
                        .then((image) => {
                            processImage(image, options);
                        })

                        .catch((err) => {
                            console.error(err);
                        });
                });
                promises.push(promise);
            }
            Promise.all(promises);

            if (err) {
                next(err);
                return;
            }

            Object.assign(req, { fields, files });
            next();
        });
    };
}

module.exports = parse;
exports.parse = parse;

我将它添加到一个文件中,var formidableMiddleware = require('./formidableMiddleware')然后用 和调用它,仅此而已app.use(formidableMiddleware())

问题是这个逻辑只返回第一项,我不能让它同时返回它们。我认为这与我使用 Promises 的方式有关,但我找不到错误。

欢迎任何建议!!!

标签: javascriptnode.jsexpresspromiseformidable

解决方案


推荐阅读