在 ExpressJS 中从 post 请求写入文件

writing file from post request in ExpressJS

和express一起做一个文件传输工具,我已经差不多完成了。只需要弄清楚如何从写入文件的请求中获取数据。

我的问题似乎是因为不知道文件内容在请求对象中的位置。

我处理发送请求的代码

let file = watcher.getOneFile(config.thisLocation);
console.dir(file);
let contents = fs.readFileSync(file.fullPath, 'utf-8');
console.log(contents);
let form = {
  attachments: [
    contents
  ]
}
rq.post({
  url: `http://${homeAddress}:${port}/files/?loc=${config.thisLocation}&file=${file.fileName}`,
  headers: {'content-type':'application/x-www-form-urlencoded'},
  formData: form
}, (err, res, body) => {
  // body = JSON.parse(body);
  console.log(body);
});

当我在服务器上收到请求时,我不确定文件内容实际在哪里。

处理请求的代码

app.post('/files', (req, res) => {
  console.log(req.query.loc);
  // console.dir(req);
  let incoming = watcher.getOutputPath(req.query.loc, config.locations);
  console.log(incoming);
  console.dir(req.body);
  // console.log(req.body);
  // let body = JSON.parse(req.body);
  console.log(req.query);
  let filename = path.join(incoming, req.query.file);
  console.log(filename);
  fs.writeFile(filename, req.body, (err) => {
    if(err){
      console.error(err);
    }
    console.log(`Successfully wrote file: ${path.join(incoming, req.query.file)}`);
  });
  res.sendStatus(200);
});

请求对象的文件内容在哪里?

遗憾的是,您无法以任何直接的方式访问文件内容。我建议您使用 busboy 或类似的包来解析表单数据请求。

以下是如何使用 busboy 读取文件内容并将其写入文件系统:

const Busboy = require('busboy');

app.post('/files', (req, res) => {
  const busboy = new Busboy({ headers: req.headers });

  busboy.on('file', (fieldname, file, filename, encoding, mime) => {
    const newFilename = `${Date.now()}_${filename}`,
      newFile = fs.createWriteStream(newFilename);

    file.pipe(newFile);

    file.on('end', () => {
      console.log(`Finished reading ${filename}`);
    });
  });

  busboy.on('finish', () => {
    console.log('Finished parsing form');

    res.sendStatus(200);
  });

  req.pipe(busboy);
});