Привет.
Бьюсь над проблемой уже много часов:
Хочу отправить ZIP файл с компьютера с помощью NodeJS. Отправляю буфер файла методом PUT. И данные передаются. Однако тот файл, который записывается на сервер не соответствует по размеру изначальному файлу.
Вот как я делаю в
NodeJS отправку файла:
const buffer = fs.readFileSync(`../source/archive.zip`);
const options = {
hostname: url.hostname,
port: 443,
path: url.pathname,
method: 'PUT',
headers: {
'Content-Type': 'application/zip',
'Content-Length': buffer.length
}
};
const req = https.request(options, res => {
res.on('error', err => console.log('ошибка:', err));
res.on('end', () => console.log('отправлено'));
});
req.write(buffer);
req.end();
А вот так я принимаю файл на сервере с помощью
NodeJS + Express:
router.put('/', (req, res, next) => {
const pathToFile = path.join(__dirname, '..', 'public', 'uploads', 'archive.zip');
let chunks = '';
req.on('data', chunk => {
chunks += chunk;
});
req.on('end', () => {
fs.writeFile(pathToFile, chunks, { encoding: 'binary' } , (err) => {
if (err) throw err;
res.send('файл сохранён');
});
});
});
Как я написал выше: сохраняемый файл всегда отличается по размеру от оригинала. При этом, если в функции
writeFile
я указываю кодировку
'binary'
, то размер сохранённого файла чуть-чуть меньше оригинального. А если не указываю кодировку, то размер примерно вдвое больше оригинала. В обоих случаях архив получается битым и не разархивируется.
Скажите, что я делаю не так? Весь интернет уже перерыл...
Ещё меня смущает то, что с буфером данных не передаются мета-данные файла. Или всё-таки отправляются, но я не знаю как это проверить.
Заранее спасибо!