【问题标题】:Save multi image Multer保存多图像 Multer
【发布时间】:2018-05-10 03:20:00
【问题描述】:

我在使用 Multer 保存多个图像时遇到问题

    <form action="/api/imagesSection" method="post" enctype="multipart/form-data">
      <input type="file" name="uploadedImages" value="uploading_img" multiple>
      <input type="submit" value="uploading_img">
    </form>

路线如下:

router.post('/imagesSection', upload.array('uploadedImages', 10), function(req, res) {
        let timeInMs = Date.now();

        for(var i = 0; i < req.files.length; i++){
            let imageS = new ImageS();
            let file = req.files[i].destination + '/' + timeInMs +req.files[i].originalname ;
            imageS.imageUrl = req.files[i].destination + '/' + timeInMs +req.files[i].originalname ;
            imageS.title = 'req.body.title';
            imageS.description = 'req.body.description';

            fs.rename(req.files[i].path, file, function(err) {
                if (err) {
                    console.log(err);
                    res.send(500);
                } else {
                    imageS.save();
                    // res.redirect(req.get('referer'));
                    console.log(imageS);
                }   

            });
        }
    });

如您所见,我在每个循环中调用 `save() One new ImageS(); 胸围它只是保存第一个 IMG 文件。有什么想法吗?

【问题讨论】:

    标签: html node.js multer


    【解决方案1】:

    以下代码异步工作,这就是为什么你只保存一张图片。

             fs.rename(req.files[i].path, file, function(err) {
                if (err) {
                    console.log(err);
                    res.send(500);
                } else {
                    imageS.save();
                    // res.redirect(req.get('referer'));
                    console.log(imageS);
                }   });
    

    不要使用 for 循环,而是尝试使用 forEach(),就像我在代码中所做的那样。

    var images = [];
    req.files.forEach(function(value, index){
            console.log(req.files.length);
            var tempPath = value.path;
            var targetPath = path.resolve('public/img/flat_images/'+flat._id+index+'.'+value.originalname.split('.').slice(-1).pop());
            images.push('/img/flat_images/'+flat._id+index+'.'+value.originalname.split('.').slice(-1).pop());
            console.log(images);
            fs.rename(tempPath,targetPath,function(err){
                if(err) return res.status(400).end();
            });
        });
    
    flat.images = images;
     flat.save(function(err){
       if(err) return res.status(400).end();
       res.send(flat);
     });
    

    希望,它会有所帮助。

    【讨论】:

      【解决方案2】:

      可能是您的文件都具有相同的 originalname 并且由于 timeInMs 仅声明一次,因此在您的 for 循环之前它不能用作唯一标识符。

      您是否尝试过记录 req.files.length 的值?它会返回您期望的结果吗?

      编辑:您可以尝试将所有需要的文件添加到数组中。然后您可以使用.create() 将数组中的所有项目保存在一个函数调用中,如下所示:

      ImageS.create(fileArray, function (err) {
        if (err) // ...
      });
      

      【讨论】:

      • 它会返回您期望的结果吗?是的,我已经检查过了,我必须试试你所说的
      • 没有我的朋友偷同样的问题
      • 我假设imageS 是猫鼬模型?您可以编写一个 .then() 函数来记录每次成功保存到数据库。这可能会给你一些见解。我认为您遇到了问题,因为 Mongoose .save() 是一种异步 IO 方法。您必须使用 async.each 或使用 .create() 批量添加项目
      • 好吧,我走了
      • 请告诉我,什么是fileArray? ImageS.create(fileArray, function (err) { if (err) // ... });
      猜你喜欢
      • 2017-05-26
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2021-11-18
      • 2019-07-22
      • 2018-09-07
      • 2021-05-17
      • 1970-01-01
      相关资源
      最近更新 更多