Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.04.2016, 18:44
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

Как правильно сохранить загруженный файл?
Только начинаю осваивать 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;
};
Ответить с цитированием
  #2 (permalink)  
Старый 02.04.2016, 20:26
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

https://learn.javascript.ru/xhr-form...part-form-data
Ответить с цитированием
  #3 (permalink)  
Старый 02.04.2016, 20:42
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

И к чему ты это?
Браузер сам формирует запрос в FormData.. ты о моём парсере?
Ответить с цитированием
  #4 (permalink)  
Старый 02.04.2016, 20:58
Аспирант
Посмотреть профиль Найти все сообщения от protoquest
 
Регистрация: 02.04.2016
Сообщений: 50

2chan,
Я как то трахался с этим, в ноде, подробностей не помню, но помню, что она косячила, портила файл(мб просто версия содержала ошибку). Я проверял на другом серваке, все работало, в ноде же файл забирался запоротым.. А так, там все достаточно просто, она достается из request.headers или чего то в этом роде. К сожалению б*кая нода не предоставляет сырую строку, которая приходит на сервак(или я х*во искал) короче, попробуй поковырять request.headers. дальше просто выдергиваешь этот кусок и сохраняешь на диск.
Ответить с цитированием
  #5 (permalink)  
Старый 02.04.2016, 21:18
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

Спасибо, сейчас попробую поковырять headers
Ответить с цитированием
  #6 (permalink)  
Старый 02.04.2016, 22:14
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

Сообщение от 2chan Посмотреть сообщение
Спасибо, сейчас попробую поковырять headers
Я не пойму, ты имел в виду что корёжит формдату или что?
Ответить с цитированием
  #7 (permalink)  
Старый 02.04.2016, 22:30
Аспирант
Посмотреть профиль Найти все сообщения от protoquest
 
Регистрация: 02.04.2016
Сообщений: 50

2chan,
корежит сам файл, который приходит из сети. Я не знаю на каком этапе там это происходит, но когда достаешь этот файл, сохраняешь на диск, потом открываешь, картинка отображается некорректно. Если открываешь текстовым редактором, и сравниваешь с оригиналом, то видно, что там добавляются какие то пробелы, или табы, хз. Короче бинарь запарывается. Но это у меня так было. Может просто версия была косячная.
Ответить с цитированием
  #8 (permalink)  
Старый 02.04.2016, 22:39
Аспирант
Посмотреть профиль Найти все сообщения от protoquest
 
Регистрация: 02.04.2016
Сообщений: 50

2chan,
то есть, да формдату, ее содержимое, точней
Ответить с цитированием
  #9 (permalink)  
Старый 03.04.2016, 01:44
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

Сообщение от protoquest Посмотреть сообщение
2chan,
то есть, да формдату, ее содержимое, точней
У меня ничего не корёжит. То есть оригинальный файл равен загруженной дате, но после записи с ним что-то происходит и записанный файл не равен ни записанной дате, ни оригинальному файлу.
Ответить с цитированием
  #10 (permalink)  
Старый 03.04.2016, 21:45
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

Провёл пару экспериментов.

Следующие куски кода работает нормально:
fs.readFile('origin.png', function(error, result) {
  fs.writeFile('copy.png', result, function() {});
});

var content = fs.readFileSync('origin.png');
fs.writeFileSync('copy.png', content);


То есть проблема возникает только когда записываешь в файл именно полученные через form-data данные. В таком случае файлы ломаются.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как правильно обращаться к свойствам объект внутри самого объекта ? mitiya Общие вопросы Javascript 12 25.04.2015 21:18
Как скачать файл через JS? Dimaz Events/DOM/Window 9 20.07.2014 22:20
как правильно отслеживать вставку html() bombascter jQuery 15 20.11.2012 09:47
Как правильно очистить maxlength в input? Маэстро Events/DOM/Window 10 22.06.2011 18:14