Только начинаю осваивать Node.JS, так что вопрос соответствующий. Тем не менее, я бьюсь над ним уже 3й день, попутно дорабатывая код.
Есть файл, origin.png - оригинал картинки. Он лежит в директории со скриптом, для упрощений дебага.
Пытаюсь его залить и сохранить под другим именем через форму, отправленную в кодировке multipart/form-data.
Я не люблю чужой код, поэтому не использую модули кроме тех, что в ядре. Даже парсинг формы.
Когда заливаю файл -- непонятно что не так. Содержимое файла origin.png, который я загружал, равно полученным данным. Но полученные данные не равны содержимому файла copy.png, который я создавал из них!
Объясните, пожалуйста, как правильно этот файл скачивать/обрабатывать/записывать. А то я уже ничего не понимаю.
Файл index.js:
var fs = require('fs');
var multipart = require('./form');
require('http').createServer(function go(request, response) {
var GET = url.parse(request.url, true).query;
var POST = {};
if (request.url == '/post') {
var globalData = '';
request.addListener('data', function(chunk) {
globalData += chunk;
}).addListener('end', function() {
POST = request.headers['content-type'].startsWith('multipart') ? multipart(request, globalData) : url.parse(globalData, true).query;
fs.writeFile('copy.png', POST.file.content, 'binary', function() {
console.log('match: ', fs.readFileSync('origin.png') == POST.file.content); // 1
console.log(POST.file.content == fs.readFileSync('copy.png')); // 2
});
response.end();
})
} else {
response.setHeader('Content-Type', 'text/html');
response.end(`
<form action="/post" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="text" name="text" />
<input type="submit" />
</form>
`);
}
}).listen(80);
console.log('Node.js started');
Файл form.js, парсер для формы:
module.exports = function(request, content) {
/* if (request.headers['content-length'] != content.length) {
//options.error(1);
return;
}*/
var result = {};
content.split('--'+ /boundary=(.+)$/.exec(request.headers['content-type'])[1]).slice(1, -1).forEach(function(part) {
var exec = part.split('\r\n\r\n'),
info = exec[0];
var name = /name="([^"]+)"/.exec(info)[1],
fname = '',
type = '';
if (info.includes('\n')) { // имеется рядок с Content-Type
fname = (/filename="([^"]+)"/.exec(info) || [])[1];
type = (/Content-Type: ([^\n]+)/.exec(info) || [])[1];
}
var value = exec.slice(1).join('\r\n\r\n');
while (value.endsWith('\r\n')) { // убираем лишние \r\n в конце полей
value = value.slice(0, -2);
}
result[name] = type ? { type: type, fileName: fname, content: value } : value;
});
return result;
};