如何在Nodejs中处理多个图像上传

时间:2014-12-02 17:17:13

标签: node.js file-upload express

我尝试使用Nodejs和Expressjs(4.0)上传图片大约两天。

到目前为止,我试过几个中间件,比如:Formidable,Blueimp,Busboy,Multer ......

其中很少一部分我在一个临时文件夹中正确保存了一张图片,但当我尝试上传多张图片时出现问题。

所以,我的简单控制器看起来像:

exports.postAccountImages = function(req, res, next) {
  User.findById(req.user.id, function(err, user) {
    console.log(req.files);
  });
};

我收到的内容总是单个对象,如:

{
  files: {
    // data...
  }
}
{
  files: {
    // data...
  }
}

但不在数组中,因此我无法使用for管理所有传入的文件。

我需要将名称更改为图像并将其保存在基于user.id名称的动态文件夹中......但它似乎太棘手了。

我可以一个接一个地做,但我希望在多个图像上这样做。

您是否了解中间件或如何正确使用我已尝试管理多个文件的中间件之一?

编辑:

我使用Dragzone作为客户端。 这里没什么特别的,跟着最初的教程:

玉:

#uploader.fileInput
  h3 Drop your images here!

JS:

var myDropzone = new Dropzone(document.body, {
        url: "/account/images", // Set the url
        autoQueue: true,
        paramName: "file",
        uploadMultiple: true,
        autoProcessQueue: true,
        clickable: ".fileInput"
});

2 个答案:

答案 0 :(得分:1)

希望这能解决您的问题,这是我的多个上传文件的方法:

Nodejs:

router.post('/upload', function(req , res) {

var multiparty = require('multiparty');
var form = new multiparty.Form();
var fs = require('fs');

form.parse(req, function(err, fields, files) {  
    var imgArray = files.imatges;


    for (var i = 0; i < imgArray.length; i++) {
        var newPath = './public/uploads/'+fields.imgName+'/';
        var singleImg = imgArray[i];
        newPath+= singleImg.originalFilename;
        readAndWriteFile(singleImg, newPath);           
    }
    res.send("File uploaded to: " + newPath);

});

function readAndWriteFile(singleImg, newPath) {

        fs.readFile(singleImg.path , function(err,data) {
            fs.writeFile(newPath,data, function(err) {
                if (err) console.log('ERRRRRR!! :'+err);
                console.log('Fitxer: '+singleImg.originalFilename +' - '+ newPath);
            })
        })
}
})

确保您的 enctype =“multipart / form-data”

我希望这能帮到你;)

答案 1 :(得分:1)

希望这可以解决您的问题。 如何使用Nodejs和MongoDB上载多个图像

import formidable from 'formidable';
import multiparty from 'multiparty';
import _ from 'lodash'
import fs from 'fs'

async create(req,res){
    let form = new multiparty.Form();
    form.keepExtensions=true;
    form.parse(req,(err,field,files) => {
        if(err)
        {
            return res.status(400).json({
                error:'Image Could Not Uploaded'
            })
        }

        // Multiple Image Store into Database
        let product = new Product(field)
        var imgArray = files.photo;
        var photoarray =  new Array();
        for (var i = 0; i < imgArray.length; i++) {
            if(imgArray.size >= 1000000)  
            {
                res.status(401).json({
                    error:'Image is Less then 1 MB'
                })
            }  
            var newPath = './uploads/product/';
            var singleImg = imgArray[i];
            newPath+= Date.now()+'_'+singleImg.originalFilename;
            readAndWriteFile(singleImg, newPath);     
            photoarray.push(newPath)      
        }
        product.photo=photoarray;

        //Comma Separated Value Store into MongoDB
        var sizestr = field.size.toString()
        var text_arr = sizestr.split(',')
        var sizearray =  new Array();
        for(var i=0;i<text_arr.length;i++)
        {
            sizearray.push(text_arr[i])
        }
        product.size=sizearray;
        product.name=field.name.toString()

        product.save((err,result)=>{
            console.log(err)
            if(err){
                return res.status(400).json({
                    error:errorHandler(err)
                })
            }
            return res.json(result)
        })
    });
    function readAndWriteFile(singleImg, newPath) {

            fs.readFile(singleImg.path , function(err,data) {
                fs.writeFile(newPath,data, function(err) {
                    if (err) console.log('ERRRRRR!! :'+err);
                    console.log('Fitxer: '+singleImg.originalFilename +' - '+ newPath);
                })
            })
    }
}