Как загрузить файл на node.js сервер без сторонних библиотек ? Что происходит с файлом когда он загружается через форму ? Какой формат он приобретает ? И как просмотреть настоящее содержимое этого файла ?
Вот html код странички где только input для загрузки файла и кнопка для сабмита формы
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<form id="file_load">
<input type="file" name="myfile">
<input type="submit" value="Загрузить">
</form>
<script src="script.js"></script>
</body>
</html>
Вот код файла script.js который просто отправляет файл из формы на сервер:
file_load.onsubmit = function(){
var file = this.elements.myfile.files[0];
var xhr = new XMLHttpRequest();
xhr.open("POST", "upload", true);
xhr.send(file);
return false;
}
И наконец код на бекенде, который принимает и записывает файл:
const server = require('http').createServer();
var fs = require('fs');
var static = require('node-static');
var file = new static.Server('.', {
cache: 0
});
server.listen(3000,()=> console.log("сервер запущен"));
server.on('request',(req,res)=>{
if (req.url == '/upload') {
var body = "";
req.on('data', function(chunk) {
body+=chunk;
}).on('end',function(){
fs.writeFileSync("file2.jpg",body);
res.end('ok');
})
}else{
file.serve(req, res);
}
});
Весь код рабочий, и хорошо справляется со своей задачей, но как выясняется отправляется не файл а какая то фигня, неизвестного формата. Если файл изначально весил 185 кб, то загруженный весит 300 кб,
первые строки в хексе файла оригинала:
и загруженного:
И я начал упорно гуглить, что же происходит с файлом, когда он загружается через форму, и как с этим быть. Толком ничего не нашел, но узнал что файл можно прочитать с помощью file api. Прочитал файл методом reader.readAsText() , думал с помощью этого получу содержимое файла, но ничего не изменилось, файл отправляется точно таким же форматом.
вот мой измененный код под file api script.js:
var reader = new FileReader();
file_load.onsubmit = function(){
var file = this.elements.myfile.files[0];
reader.readAsText(file);
return false;
}
reader.onload = function(e) {
file = e.target.result;
upload(file);
}
function upload(file){
var xhr = new XMLHttpRequest();
xhr.open("POST", "upload", true);
xhr.send(file);
}
Ничего не изменилось , приходит тот же файл