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