Запись файла из почтового запроса в 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);
});

Где в объекте запроса находится содержимое файла?

1 ответ

Решение

К сожалению, вы не можете получить доступ к содержимому файла любым простым способом. Я рекомендую вам использовать 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);
});
Другие вопросы по тегам