Как хешировать и скачивать изображения с запросом? - PullRequest
0 голосов
/ 09 декабря 2018

Ситуация

Чего я хочу добиться, это загрузить изображение в буфер, хэшировать его, , затем сохранить его.

Я не могу записать на диск до хэширования.

Код (внутри Обещания)

const filename = this.getPathFromHash(hash);
if (!fs.existsSync(path.dirname(filename))) fs.mkdirSync(path.dirname(filename));
fs.writeFile(filename, body, 'binary', (e) => {
  if (e) reject(e);
  parser.MediumVersion.create({
    hash, url, type, size, width, height,
  }).then(resolve).catch(reject);
});

Результат

повреждение файла, но он создал файлы:)

Редактировать: IrFanView говорит, что это JPEG с неправильным расширением, затем он просто говорит , а не файл JPEG, начинается с (два случайных байта здесь)

Edit2: Что это такое ??Четыре байта 0xfd?Что они имеют в виду?В противном случае заголовок изображения выглядит нормально.

fdfdfdfd

Edit3: удаление этих байтов не решает проблему: / Может быть, кодирование является виновником?Я попытался изменить его на UTF-8, пока что не повезло.

Edit4: Быстрое сравнение!Первый загружен с использованием моей программы, второй - Chrome.

comparison

Структура каталогов

Я знаю, я знаю, SHA-256хэши длиной 64 символа.Для простоты я собираюсь использовать 8 символов.

Учитывая хеш 0123abcd, создайте каталог 01 (если он не существует (slice(0,2)), затем поместитефайл с именем 23abcd (slice(2)). Я видел эту структуру во многих кэшах.

Пример:

01/
  23abcd
  45abcd
ab/
  cdef01
  010101

1 Ответ

0 голосов
/ 09 декабря 2018

Согласно https://github.com/request/request#requestoptions-callback:

, если вы ожидаете двоичные данные, вы должны установить encoding: null.

Так что для меня это будет request(url, { encoding: null }, (e, resp, body) => {...}).

В этом случае изображение прекрасно и легко читается:)

...