@daniilshitov
Node js разработчик

Как загрузить файл на node.js сервер без сторонних библиотек?

Как загрузить файл на 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 кб,
первые строки в хексе файла оригинала:
5d812c9421d0e918278273.png
и загруженного:
5d812d42c2299026715535.png
И я начал упорно гуглить, что же происходит с файлом, когда он загружается через форму, и как с этим быть. Толком ничего не нашел, но узнал что файл можно прочитать с помощью 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);
}

Ничего не изменилось , приходит тот же файл
  • Вопрос задан
  • 1131 просмотр
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
В данном случае файл отправляется в теле запроса как есть, без всяких оберток:
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();
const fs = require('fs');
const nodeStatic = require('node-static');
const file = new nodeStatic.Server('.', {
  cache: 0
});

server.listen(3000, () => console.log("сервер запущен"));
server.on('request', (req, res) => {
  if (req.url == '/upload') {
    req.pipe(
      fs.createWriteStream('file2.jpg')
    ).on('finish', () => res.end('ok'));
    return;
  }
  file.serve(req, res);
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы