Node.js, отправляющий http.ClientRequest в fs.createWriteStream с двоичными файлами, приводит к поврежденным / раздутым файлам - PullRequest
6 голосов
/ 05 октября 2011

У меня странная проблема с модулем Node.js (v0.4.12), над которым я работаю.Это модуль CouchDB, и, хотя я почти уверен, что здесь проблема не в CouchDB, я включу его, поскольку это может быть полезной информацией.

В любом случае, я пишу оболочку для загрузки и загрузки вложений.с CouchDB.У меня очень хорошо работает часть загрузки, у меня возникают проблемы с загрузкой.

Мой тестовый процесс такой:

  1. Загрузить файл изображения (http.request, fs.createReadStream)
  2. Загрузка файла (http.request)
  3. Сохранение загруженного файла в другое место для сравнения / проверки повреждения(fs.createWriteStream, stream.pipe)

Это прекрасно работает с текстовыми файлами, но двоичные файлы, такие как изображения, ведут себя по-разному.

Как я уже упоминал ранее, загрузка выглядит нормально.Как я могу посетить URL в CouchDB и просмотреть изображение.(размер совпадает, и он отображает загруженное изображение). Когда я использую свой модуль для загрузки и сохранения файла, выходной файл больше исходного файла (на 50-100% больше) и не может быть открыт ни одним изображениемредактора.(следовательно, он как-то «поврежден»)

Я что-то упускаю в Streams, когда дело доходит до двоичных файлов?Я попытался изменить encoding с обеих сторон на "binary" и "base64", но выходной файл по-прежнему на 50% больше исходного.До того, как я обнаружил параметр кодирования, он был установлен на "utf8", а выходной файл был на 100% больше, поэтому я подумал, что это проблема кодирования где-то там.

Я также пробовалручная передача потоков (вместо использования самого метода pipe), но результат тот же.

Ответы [ 2 ]

6 голосов
/ 05 октября 2011

Извините, если я неправильно понял этот вопрос, но, похоже, вы пытаетесь использовать кодировки с двоичным файлом.Вам не нужно: узел по умолчанию дает вам необработанные буферы с двоичными данными.

Вот пример того, как я загружаю клоуна:

var http = require("http"),
    fs   = require("fs");

http.get({ 
  host: "2.bp.blogspot.com", 
  path: "/_IR8qT_UKjOI/TT2P3qleU9I/AAAAAAAAA3I/beckWSLh3nk/s1600/clown.jpg" },
  function(res) {
    var stream = fs.createWriteStream("clown.jpg");
    res.pipe(stream);
  });

Надеюсь, это поможет.

0 голосов
/ 05 октября 2011

Проверка: https://github.com/joyent/node/issues/1569

Узлу не нравятся переводы строк в http.Обновите свой узел.

Если вы ищете couchdb, у меня есть запись в блоге на эту тему в моем блоге на writings.nunojob.com.Использование nano, как правило, является хорошим выбором в качестве клиентского дивана

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...