【问题标题】:Image uploaded to cloudinary twice图片上传到 cloudinary 两次
【发布时间】:2021-04-22 07:11:41
【问题描述】:

我尝试将图片上传到 cloudinary,但是当我上传一张图片时,它上传了两次到 cloudinary,当我上传 2 张图片时,它上传了 4 张等并返回了 uploadFiles =[]。所以我的代码有什么问题

我使用 multer-cloudinary 包和 multer 作为中间件 ..................................................... ......................

app.post("/multiple-upload", multerMiddleware.array("files"), async (req, res) => {
try {
if (!req.files) {
return res.status(200).json({ message: "Invalid file type" });
}
let uploadedFiles = imageUploaderHandler({ files: req.files });
return res.status(200).json({ message: "File stored", uploadedFiles });
} catch (error) {
console.log(error);
return res
.status(500)
.json({ message: "Something went wrong while uplaoding this item" });
}
})

const imageUploaderHandler = async ({ files }) => {
let file = {};
let uploadedFiles = [];
let newImages = files.map(async (item) => {
let result = await cloudinary.v2.uploader.upload(item.path)
console.log(result);
file.cloudinaryPublicId = result.public_id;
file.fileUrl = result.secure_url;
file.fileName = result.original_filename;
uploadedFiles.push(file);

});
return await Promise.all(newImages);
};


//Multer-cloudinary config

import cloudinary from "cloudinary";
import { CloudinaryStorage } from "multer-storage-cloudinary";

cloudinary.v2.config({
  cloud_name: CLOUD_NAME,
  api_key: API_KEY,
  api_secret: API_SECRET,
});
let cloudinaryVersion = cloudinary.v2;

const fileStorage = new CloudinaryStorage({
  cloudinary: cloudinaryVersion,
  folder: "uploads",
  filename: (req, file, cb) => {
    const date = format(new Date(), "dd-MM-yy");
    const fileType = file.mimetype == "video/mp4" ? "VIDEO" : "IMAGE";
    const fileNameFormat = `${date}-${fileType}-${file.originalname}`;
    cb(null, fileNameFormat);
  },
});

const fileFilter = (req, file, cb) => {
  if (!file.originalname.match(/\.(jpg|jpeg|gif|png|mp4)$/i)) {
    cb(null, false);
  } else {
    cb(null, true);
  }
};
export const multerMiddleware = multer({
  storage: fileStorage,
  fileFilter,
});

【问题讨论】:

    标签: node.js image express multer cloudinary


    【解决方案1】:

    你的编码方法不干净,有很多错误,你可以使用qasync模块来解决你的问题:

    let async = require('async');
    let q = require('q');
    const imageUploaderHandler = async ({ files }) => {
      let defer = q.defer(); // define a defer
      let file = {};
      let uploadedFiles = [];
      async.eachSeries(files, async (item)=>{ //it is a loop 
       try {
        let result = await cloudinary.v2.uploader.upload(item.path)
        console.log(result);
        file.cloudinaryPublicId = result.public_id;
        file.fileUrl = result.secure_url;
        file.fileName = result.original_filename;
        uploadedFiles.push(file);
       } catch (error) {
         console.log("something is wrong : ", error)
       } 
      },()=>{
        defer.resolve(uploadedFiles) //its callback when finished loop,do something, we want return result as a promise
      })
      return defer.promise; // this function returns promise
      };
    

    因为使用了q,所以这个函数返回promise,就像在路由中这样做:

    let uploadedFiles = await imageUploaderHandler({ files: req.files });//use await
    

    查看async 文档和q 文档

    【讨论】:

    • 如果您的问题没有解决,请留言
    • 将 multerMiddleware 添加到问题中
    • 我在问题中添加了 multer 中间件
    • 在 app.post("/multiple-upload") 的第一个显示 console.log(req.files)
    • [ { fieldname: 'files', originalname: 'download (1).jpg', encoding: '7bit', mimetype: 'image/jpeg', path: 'res.cloudinary.com/dkwfxxq7k/image/upload/v1610972721/uploads/…', size :5189,文件名:'uploads/ojucgefzjpjdhnepmg2s'},{字段名:'文件',原始名称:'download.jpg',编码:'7bit',mimetype:'image/jpeg',路径:'res.cloudinary.com/dkwfxxq7k/image/upload/v1610972721/uploads/…',大小:3784,文件名:'上传/vi612hnz67e5mdjkjqwd'}]
    猜你喜欢
    • 2019-05-07
    • 2022-01-12
    • 2016-09-20
    • 2015-12-19
    • 2017-02-23
    • 2020-09-20
    • 2016-04-12
    • 2019-02-14
    • 2015-01-25
    相关资源
    最近更新 更多