簡體   English   中英

NodeJS&Multer:如果發生錯誤,請停止上傳文件

[英]NodeJS & Multer: stop uploading file if error occurs

你好我用Node&Multer創建文件上傳,它可以工作,但問題是如果發生錯誤(就像用戶沒有填寫其他字段)它仍然上傳我不想要的文件

我真的不知道該怎么辦,因為我是第一次這樣做所以希望如果有人有這方面的經驗。 這是我的代碼

const storage = multer.diskStorage({

  destination: (req, file, callback) => {
    const userPath = path.join(imgStoragePath, req.userId);
    fs.mkdir(
      userPath,
      () => callback(null, userPath)
    )
  },

  filename: (req, file, callback) => {
    const filenameParts = file.originalname.split('.');
    const ext = filenameParts.pop();
    const basename = filenameParts.join('.');
    const additionalPath = Date.now() + '' + uuid() + '' +             
Math.floor(Math.random() * (2000 - 500)) + 500;
    callback(null, basename + '-' + additionalPath + '.' + ext);
  }

})

const upload = multer({
  storage,
  limits: '1mb'
})


   router.post('/', upload.single('image'), async (req, res) => {
  //code
})

如果發生錯誤,它應該返回錯誤消息並將其發送到服務器並停止代碼執行並且不做任何事情,它會這樣做但也上傳文件,我知道這會發生因為upload是中間件而中間件首先執行而我希望它防止它。 謝謝!

 app.post('/upload',[
  multer({
    dest    : './uploads/',
    onError : function(err, next) {
      console.log('error', err);
      next(err);
    }
  }),
  function(req, res) {
    res.status(204).end();
  }
]);

//從multer docs中查看此鏈接https://github.com/expressjs/multer#error-handling

好吧,所以multer並不真正負責驗證您的表單輸入,它的唯一目的是允許您將文件上傳到后端。 現在開始解決你要解決的問題

  • 您可以在前端進行html驗證,以確保用戶在提交表單之前填寫所有required字段
  • 您可以進行后端檢查以確保已填寫所有必填字段

為了使用第二步,您可以使用這樣的功能

 export const setRequired = (...args: any): boolean => {
   let isValid = true;
   _.forEach(args, value => {
     if (isUndefined(value)) isValid = false;
   });
   return isValid;
 };
 const isValid: any = setRequired(file, first_name, last_name);

該函數使用typescript和lodash並檢查指定的所有參數是否存在。 因此,在您的后端執行任何操作之前,將所需的字段傳遞給函數,該函數將返回一個布爾值,以通知您是否已從前端接收到所有必需的字段。

關於與multer的文件大小和文件類型錯誤相關的第2部分,您可以嘗試這樣的事情

 const storage = multer.diskStorage({
 destination(req, file, cb) {
   cb(null, path.join(__dirname, `path_to_folder`));
 },
 filename(req, file, cb) {
   const ext = path.extname(file.originalname).toLowerCase();
   const file_name = uuidv4() + "_" + ext;
   cb(null, file_name);
 },
});

const upload = multer({
 storage,
 limits: { fileSize: 2000000 }, // In bytes: 2000000 bytes = 2 MB
 fileFilter(req, file, cb) {
   const ext = path.extname(file.originalname).toLowerCase();
   if (ext !== ".png" && ext !== ".jpg" && ext !== ".jpeg") {
     cb(new Error("Error: Unacceptable file format"), false);
   } else {
     cb(null, true);
   }
 },
}).any();
  router.post("/", (req, res) => {
    upload(req, res, async err => {
      if (err) {
        console.error(err);
        // An unknown error occurred when uploading.
        // the err object will contain the reason for the multer error
      } 

      if (req.files && req.files[0]) {
        // file has been saved 
         console.log(req.files[0].filename);
      }

    });
  },
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM