удалить и создать папку перед загрузкой файлов в папку с помощью Multer - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь загрузить файлы в папку, используя multer, и она работает нормально.
Теперь мое требование - прежде чем загружать файл в папку «загрузки», сначала следует удалить его, создать папку загрузки и затем загрузитьit.
Я просто хочу выполнить операцию с загруженным файлом, а не с предыдущими сохраненными данными.
Код:

const fs = require("fs-extra");
const path = require("path");
const uploadPath = path.resolve(__dirname, "uploads");
const multer = require("multer");

const storage = multer.diskStorage({
  destination: "./uploads/",
  filename: function(req, file, cb) {
    cb(null, file.originalname);
  }
});

const upload = multer({ storage: storage });

router.post("/fileupload", upload.array("docs", 10), async function(
  req,
  res,
  next
) {
  let result = {};
  try {

    if (fs.existsSync(uploadPath)) {
      fs.removeSync(uploadPath);
      console.log("dir removed");
      fs.ensureDirSync(uploadPath);
      console.log("directory created");
    } else {
      fs.ensureDirSync(uploadPath);
      console.log("directory created");
    }

    const uploadObj = util.promisify(upload.any());
    await uploadObj(req, res);

    result.message = "Upload successful";
    res.send(result);
  } catch (e) {
    console.error(e);
    console.error("Upload error");
  }
});

Я также пытался сделать код асинхронным, но после этого он не загружаетсялюбой файл.Я понял, что upload.array - это промежуточное ПО, поэтому оно запускается первым при каждом вызове POST, а остальные запускаются после этого.Поэтому multer загружает данные в существующую папку, а затем, когда они попадают внутрь POST, fs удаляет и создает их снова.
как я могу заставить их работать?
Спасибо

1 Ответ

0 голосов
/ 14 декабря 2018

Я нашел способ заставить его работать.
Поскольку multer является промежуточным программным обеспечением, он сначала выполняет, а затем остальной код.Поэтому я поместил это промежуточное ПО в свой код вместо заголовка.Ниже приведен полный код.

const create_upload_dir = () => {
  if (fs.existsSync(uploadPath)) {
    fs.removeSync(uploadPath);
    console.log("dir removed");
    fs.ensureDirSync(uploadPath);
    console.log("directory created");
  } else {
    fs.ensureDirSync(uploadPath);
    console.log("directory created");
  }
  return Promise.resolve("Success");
};


const multer = require("multer");

const upload_documents = () => {
  const storage = multer.diskStorage({
    destination: "./uploads/",
    filename: function(req, file, cb) {
      cb(null, file.originalname);
    }
  });

  const upload = multer({ storage: storage });

  return upload;
};

router.post("/fileupload", async function(req, res, next) {
    let result = {};
    try {
      await create_upload_dir();

      const upload = upload_documents();

      upload.array("docs", 10);

      const uploadObj = util.promisify(upload.any());

      await uploadObj(req, res);

      console.log("upload successful");

      res.send("Upload successful");
    } catch (e) {
      console.error(e);
      console.error("Upload error");
    }
  });

уведомление, которое я помещаю в блок try

upload.array ("docs", 10);

вместо

router.post ("/ fileupload", upload.array ("docs", 10), асинхронная функция (req, res, next)

...