当前位置: 首页 > 知识库问答 >
问题:

使用Multer+Node js-postman上传多个不同的文件

司凡
2023-03-14

是否可以上传两个不同的文件(不同的扩展名)到不同的文件夹使用multer+node js。multer(1.3.0)。

我得到一个错误:“意外的字段”

//uploading content code here

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

  //uploading the cover
  //set storage engine for COVER
  var storage = multer.diskStorage({
    destination : './uploads/covers/',
    filename: function(req, file, callback){
      callback(null, randomString.generate(10) + "_"+ Date.now() + path.extname(file.originalname));
    }
  });

  //init upload for cover
  var upload = multer({
    storage: storage,
    limits:{fileSize: 50 * 1024 * 1024},
    fileFilter: function(req, file, callback) {
      checkFileTypeCover(file,callback)
    }
  }).single('artwork');

  upload(req,res, (err) => {
    if(err){
      res.json({
        success: false,
        message: 'upload failed cover with an error : '+err
      });
    }else{
      if(req.file == 'undefined'){
        res.json({
          success: false,
          message: 'failed to upload the file on the server for cover'
        });
      }else{

        console.log('we have uploaded an image');

        multer = '';

        var storage2 = multer2.diskStorage({
          destination : './uploads/content/',
          filename: function(req, file, callback){
            callback(null, randomString.generate(10) + "_"+ Date.now() + path.extname(file.originalname));
          }
        });


        //init upload for cover
        var upload2 = multer2({
          storage: storage2,
          limits:{fileSize: 50 * 1024 * 1024},
          fileFilter: function(req, file, callback) {
            checkfile(file,callback)
          }
        }).single('pdf');

        //upload image successfully, then upload pdf with new cover name
        //uploading the pdf

        upload2(req, res, (err) => {
          if(err){
            res.json({
              success: false,
              message: 'upload failed pdf with an error : '+err
            });
          }else{

            if(req.file == 'undefined'){
              res.json({
                success: false,
                message: 'failed to upload the file on the server'
              });
            }else{

              console.log('we have uploaded a pdf');

                /*

                //pdf file url for the content
                var pdf_url = req.file.filename;
                var title = req.body.title;
                var description = req.body.description;
                var free = req.body.free;
                var content_type = req.body.content_type;
                var category = req.body.category;
                var publisher = req.body.publisher;

                var newzine = new Newzine();
                newzine.title = title;
                newzine.description = description;

                if(free != null){
                  newzine.free = free;
                }
                if(content_type !=null){
                  newzine.content_type = content_type;
                }
                newzine.category = category;
                newzine.publisher = publisher;
                newzine.cover_url = 'no_image.png';
                newzine.pdf_url = pdf_url;

                //save the newzine on the mongo db database
                newzine.save(function(err){
                  if(err){
                    res.json({
                      success: false,
                      message: 'uploaded failed',
                      error: err
                    });
                  }else{
                    res.json({
                      success: true,
                      message: 'file uploaded successful'
                    });
                  }
                });
              }
          }  
        }); 
      }
    }
  });   

});

下面我检查图像和封面

var storage = multer.diskStorage({
 destination : './uploads/content/',
 filename: function(req, file, callback){
 callback(null, randomString.generate(10) + "-"+  Date.now()+path.extname(file.originalname));
 }
});

var upload = multer({
 storage: storage,
 limits:{fileSize: 50 * 1024 * 1024},
 fileFilter: function(req, file, callback) {
 checkFileTypePDF(file,callback)
 }
}).single('pdf');

 //check file type here for pdf
  function checkFileTypePDF(file, callback){
  // Allow only PDF extensions
   const fileTypes = /pdf|PDF/;
  //check extension
  const extname = fileTypes.test(path.extname(file.originalname).toLowerCase());
  //check mime type
  const mimetype = fileTypes.test(file.mimeType);

 if(extname){
   return callback(null,true);
 }else{
  callback('only pdf is allowed');
 }
}

//check file type here for cover
 function checkFileTypeCover(file, callback){
 // Allow only Image extensions
 const fileTypes = /jpg/;
 //check extension
 const extname =  fileTypes.test(path.extname(file.originalname).toLowerCase());
 console.log('the ext name is '+extname);
 //check mime type
 const mimetype = fileTypes.test(file.mimeType);
 console.log('the mimetype is '+mimetype);

 if(extname){
   return callback(null,true);
 }else{
  callback('only images are allowed');
  }
}

我正在使用邮递员上传图像和pdf,但它在邮递员上失败了,因为它不允许两个文件同时上传。一次只能上传一个文件。

共有2个答案

方博
2023-03-14

您可以遵循以下方法:

const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        let filextPos = file
                .originalname
                .lastIndexOf('.'),
            filext = file
                .originalname
                .substring(filextPos)

        if (filext === 'jpg') {
           cb(null, './public/images/jpgs/')
        } else {
           cb(null, './public/images/pngs/')
        }
    }
});

const uploader = multer({storage: storage}).single('img');

我们在这里所做的是根据文件(图像)扩展名更改默认的上传路径。

此外,我们使用上载程序中间件,

app.post('/uploadImage', uploader, function(req, res) {
   //file uploaded and callback received.
})
阳福
2023-03-14

我希望你能上传你的代码。我将在这里发布一个非常通用的方法供您参考。无论如何,multer不介意多次上传或扩展,至少根据它的默认设置。前端代码示例:

<form action="PathOfYourChoice" method="post" enctype="multipart/form-data">
Select image to upload:
<input type="file" name="ANY_NAME_YOU_WANT" id="fileToUpload" multiple="">
<input type="submit" value="Upload Image" name="submit">
</form>

使用此表单多次上载任何文件扩展名。注意,您只需要在html标记中有多个attribute(没有必要的值)。

在后端,提供您的存储配置,例如

var storage = multer.diskStorage({//further options to be specified after 
discussion
destination: function(req, file, callback) {
    callback(null, destination_fileupload(a variable,you should set the 
path))
},
filename: function(req, file, callback) {
    //filename schema has to be changed.Further decision pending on naming 
scheme
    callback(null, Date.now()+"-"+file.originalname)
}
}); 

在后端的路由上,例如

router.post("/PathOfYourChoice",function(req,res){
var upload = multer({
    storage: storage
    }).array('ANY_NAME_YOU_WANT'); //use .singleif you want only single file 
upload . Al
upload(req,res,function(err){
if(err)
    throw err;
res.send("files uploaded")
})

需要注意的一件事是.array方法中的字符串必须与您在表单HTML中为输入元素指定的名称相同。在form action属性中指定的路径和路由路径的情况也是一样的。

 类似资料:
  • 问题内容: 我如何让multer接受来自多个文件类型字段的文件? 我有以下代码,使用node.js中的multer上传单个文件: 通过以下形式,在仅视频字段具有值的条件下(如果同时指定两个字段,则会出现“意外字段”错误): 从文档中不清楚该如何处理?任何建议,将不胜感激。顺便说一句,我尝试了以下参数变体,但没有成功: 问题答案: 您想要的是:

  • 我正在创建一个简单的应用程序,作为Ionic2的学习体验,它连接到运行multer的节点服务器上传图像。我遇到的问题是,我需要从multer获得最后的文件名回到上传它的应用程序,以保存它在本地。我使用@Ionic/Cloud-Angular中的Auth和User模块进行身份验证和用户信息。User对象有一个details对象,其中包含“name”、“email”、“username”、“image

  • 我有一个express应用程序,正在使用multer上传文件,问题是当我在生产服务器上用PM2运行该应用程序时,multer上传文件给了我一个错误:

  • 我的控制器中有以下代码: 通过中的调用: 我正在使用postman测试我的应用程序。 标题: 车身: 生的: -----WebKitFormBoundary7MA4YWXKTRZU0GW内容-配置:表单-数据;name=“上载[]”;filename=“banana.png”content-type:image/png png数据在此处。-----WebKitFormBoundary7MA4YWX

  • 由邮递员生成以下代码: 此请求在服务器上生成一个大小为0 Kb的文件。而且我无法放文件。所以,我必须放一个这样的文件: 但我有一个超时选项。 如何使用这种Rest API放置文件?

  • 我正在测试文件上传到SharePoint在线与邮递员。在我的帖子请求中,我将正文设置为form-data,并添加了一个名为a.txt.的文本文件的文件参数 当我执行请求时,我的文件被上传,但当我打开文件时,内容被删除 我已尝试将内容类型标题设置为 应用程序/x-wow-form-urlencoded或多部分/form-data 但是没有运气