javascript - 使用 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 的方式有关,但我找不到错误。
欢迎任何建议!!!
解决方案
推荐阅读
- python - 使用kmeans python进行集群和分区的字典
- python-3.x - Python3将字节对象转换为文件对象
- keras - Keras回调执行顺序?
- python - 为什么 Marshmallow 对多个项目返回空但返回单个项目?
- angular - Angular 8:使用 ngRx/store 从 reducer 获取的结果不会以异步方式更新 UI(html)
- cefsharp - 无法在 CefSharp 应用程序中设置表单输入变量
- ios - 适用于 iOS 的 glib 构建
- c# - JSON反序列化后处理空值
- javascript - 如何为 React 应用程序中的不同组件设置不同的背景颜色?
- json - 如何访问 Golang 项目的 JSON 文件中的环境变量?