【问题标题】:Upload .txt file in Node.js在 Node.js 中上传 .txt 文件
【发布时间】:2022-10-07 20:14:18
【问题描述】:

我想为多个字段(如 html_template 和 preview_image 字段)上传文件,但 Node.js 不接受它,而且它不会在控制台中记录任何错误,但在邮递员中它会响应内部服务器错误。

多用途函数:

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "src/uploads/");
  },
  filename: function (req, file, cb) {
    cb(
      null,
      file.fieldname + "-" + Date.now() + path.extname(file.originalname)
    );
  },
});

var upload = multer({
  storage: storage,
  fileFilter: function (req, file, cb) {
    var filetypes = /jpeg|jpg|png|pdf|txt/;
    var mimetype = filetypes.test(file.mimetype);
    var extname = filetypes.test(path.extname(file.originalname).toLowerCase());
    if (mimetype && extname) {
      return cb(null, true);
    }
    cb("Please upload valid file");
  },
});

创建模板路由:

router
  .route("/create")
  .post(
    upload.fields([{ name: "html_template" }, { name: "preview_image" }]),
    Template.createTemplate
  );

如果我从路由中删除字段{ name: "html_template" },那么它可以正常工作,但它不适用于该字段html_template

templateCreator 控制器功能:

exports.createTemplate = catchAsync(async (req, res) => {
  try {
    console.log(req.files);
    const template = await templateService.createTemplate(req);
    return res.succeed(template, "Template created successfully");
  } catch (error) {
    console.trace(error);
    return res.failed(500, "Internal Server Error", error);
  }
});

服务功能:

exports.createTemplate = async (req) => {
  const name = req.body.name;
  const html_template = req.files.html_template;
  const preview_image = req.files.preview_image;

  const imagePath = preview_image.map((image) => image.path);

  const template = new Template({
    name,
    html_template,
    preview_image: imagePath.toString(),
  });
  await template.save();
  return template;
};

我尝试过upload.fieldsupload.any,但它不起作用。我无法弄清楚为什么。

如果我发送 jpg、jpeg、png 文件,那么它会接受并将其保存到数据库中,但不会保存到 .txt 文件中。这是为什么?

【问题讨论】:

    标签: node.js file file-upload multer


    【解决方案1】:

    因为纯文本文件的 MIME 类型是 text/plain。它不包含字符串txt

    最好列出您接受的完整 MIME 类型,而不是进行子字符串匹配。

    在这一点上,扩展名并不重要,但如果你想要它重要,你必须单独检查它。

    【讨论】:

    • 好的,如何更改 multer 功能。你能用代码显示吗?我希望它很重要扩展
    【解决方案2】:

    您忘记定义一个 MIME 类型列表来测试您的文件 mime 类型。 我像下面这样编辑你的 fileFilter 函数,它可以工作。

    fileFilter: function (req, file, cb) {
    var filetypes = /jpeg|jpg|png|pdf|txt/;
    var mimeTypes = /text/plain|image/jpeg|image/jpg|image/png|application/pdf/;
    var mimetype = mimeTypes.test(file.mimetype);
    var extname = filetypes.test(path.extname(file.originalname).toLowerCase());
    if (mimetype && extname) {
      return cb(null, true);
    }
    cb("Please upload valid file");
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 2017-05-05
      • 2011-06-28
      • 1970-01-01
      • 2018-06-02
      • 2016-02-14
      • 1970-01-01
      相关资源
      最近更新 更多