上传文件时没有创建文件夹

No folder is being created upon uploading of files

我正在尝试将 pdf/xls/xlsx 上传到文件服务器,但每当我尝试使用 FormData 在我的后端发送文件时,都没有创建文件夹,也没有上传文件。

这是我在前端 (Vue) 的代码:

let toSubmit = {
    document_title: this.document_title.toUpperCase(),
    added_by: this.userInfo.employeeCode,
    FileName: `${this.document_title.replace(/ +/g, "_").toUpperCase()}.${this.$refs.files.files[0].name.split(".").pop().toLowerCase()}`
}

const formData = new FormData

formData.append("toSubmit", JSON.stringify(toSubmit))

_.forEach(this.uploadFiles, file=>{
    formData.append("files", file)
})

const url = `${this.api}add/template/document`
axios.post(url, formData, {
    headers: {
        'Content-Type': 'multipart/form-data',
        dataType: 'json',
    }
}).then(res=>{
    console.log('document template', res.data)
})

在我的后端,我使用 multer 上传文件,但我不知道问题出在 multer 本身还是我的代码中缺少某些东西。无论如何,这是我在后端(节点)的代码:

API

router.post("/add/template/document", uploadTemplate.array("files"), (req, res)=>{
  let myData = JSON.parse(req.body.toSubmit)
  res.send(myData)
})

正在上传

const uploadTemplate = multer({storage: storageTemplate});
const storageTemplate = multer.diskStorage({
  destination: (req, file, cb) => {
    var dir = `./uploads/DocumentTemplates/`;
    if (!fs.existsSync(dir)){
      fs.mkdirSync(dir);
    }
    cb(null, dir);
  },
  filename: function(req, file, cb){
    let myData = JSON.parse(req.body.toRequest);
    let fileName = myData.FileName
    let new_filename = `${fileName}`
    cb(
      null,
      new_filename
    )
  }
})

我还是不明白为什么没有创建文件夹。我错过了什么吗?

您正在创建一个没有递归标志的子文件夹,这就是未创建该文件夹的原因

另外,multer中间件中没有body,只有file,所以你不能像这样发送自定义数据到文件,你需要改变上传中间件

  1. 要创建子文件夹,请添加此标志:
fs.mkdirSync(dir, {recursive: true});
  1. multer中没有正文,使用file(可以添加mimetype验证,检查是否只上传了某些类型):
  filename: function(req, file, cb){
    
    console.log('file', file);

    // validate expected file against file.mimetype
    // if it fails, return error: cb(yourErrorMessage, null);

    cb(
      null,
      file.originalname // handle on front-end
    )
  }

在前端:

formData.append("files", file, 'filename goes here');