在不使用 express.js 保存文件的情况下使用文件的内容?

Mir*_*vic 5 fs node.js express multer

我正在编写一个应用程序,我可以在其中上传 CVS 文件。我有一个 CVS 解析器,因此我可以从前端将 CSV 上传到后端,对其进行处理并将其保存到数据库中。之后,我正在删除该文件。

我正在使用 multer 接受该文件并将其保存到硬盘驱动器,然后我可以读取该文件并使用该文件的内容并删除该文件。那里一切都很好。

我想弄清楚是否有办法完全跳过实际保存文件。是否有一种简单的方法可以从'multipart/form-data'表单提交文件并直接使用 express 读取内容而无需将其保存在文件系统上?

仅供参考,这就是我现在所拥有的,并且按预期工作

在前端:

static fileUpload(file) {
  const url = '/api/statement-upload';
  const formData = new FormData();
  formData.append('file', file);
  const config = {
    headers: {
      'content-type': 'multipart/form-data'
    }
  };
  return post(url, formData, config);
}
Run Code Online (Sandbox Code Playgroud)

在我的快速服务器上,我使用 multer 并定义了这样的路由:

import multer from 'multer';

export default function (router) {
  const upload = multer({dest: 'uploads/'});

  router.use('/api/statement-upload', upload.single('file'), (req, res) => {
    cvsParser(req.file.path)
      .then(() => res.json({error: false}))
      .catch(e => res.json({error: e}));
  });

  return router;
};
Run Code Online (Sandbox Code Playgroud)

在我的 cvsParser 中,我有这个:

export default function (filePath) {
  let content = fs.readFileSync(filePath, 'binary');  
  fs.unlink(filePath, () => {});

  // do nasty stuff to content and save it gently in the database
}
Run Code Online (Sandbox Code Playgroud)

简而言之,有没有一种方法可以做到这一点,而不必在使用文件内容之前将 CSV 保存到文件系统?

考虑到文件编码等,这甚至可能fs吗,也许没有办法使用?

Sha*_*vek 6

当您不想将 csv 存储在文件系统中并读取内容时,可以这样做。就我而言,我必须将 csv 文件的内容作为字符串传递给另一台服务器(不保存在服务器的本地系统中)。

const multer = require('multer');
const upload = multer({ storage: multer.memoryStorage() })

app.post(
        '/users/bulkUpload',
        upload.single('csvFile'),
        this.usersRoutes.uploadUserData
 );
Run Code Online (Sandbox Code Playgroud)

并在uploadUserData()

uploadUserData = async(
    req: Request,
    res: Response,
    next: any
): Promise<any> => {
    try {
        const options = {
                formData : {
                    'upload': String(req.file.buffer)
                },
                headers: {
                    authorization: req.token,
                    'Content-type': 'multipart/form-data'
                },
                json: true
        };
        const response = await this.http.post.exec(
                '/somePostUrl/',
                options
        );
        return res.status(200).json(response.body);
    }catch (error) {
        return next(error);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,console.log(String(req.file.buffer))将向您显示 csv 文件的内容作为字符串。

我希望它能帮助你。