Изменение размера и архивирование потоков изображений с помощью архиватора и резкого

Я пытаюсь загрузить некоторые изображения, изменить их размер, сжать их и передать с конечной точки с помощью потоков. Я использую Sharp для изменения размера и архиватор для архивирования. Я могу заставить эти пакеты работать самостоятельно, но не вместе.

Вот пример кода:

const Hapi = require('hapi');
const archiver = require('archiver');
const sharp = require('sharp');
const request = require('request');

function foo() {
  return new Promise((resolve, reject) => {
    const imageStreams = [request('https://stackru.com/images/6a32301c7e05fdecdc42dd93c61c9f378ec81285.png'), request('https://stackru.com/images/43fe8b2ddf15552566ec47c67025985915dbe154.png'), request('https://stackru.com/images/cbc315fefa16735277abcae09f676937df88c103.png')]

    const zip = archiver('zip');
    zip.on('error', e => console.log('zip error: ', e.message));
    zip.on('entry', entry => console.log('appended ', entry.name));

    resolve(zip);

    process.nextTick(() => {
      console.log('number of streams: ', imageStreams.length);

      imageStreams.map((stream, j) => {
        const resize = sharp().resize(100, 100);

        return stream.pipe(resize);
      })
      .forEach((resizedImageStream, i) => {
        console.log('appending ', i, ' to zip');
        zip.append(resizedImageStream, { name: `${i}.png` });
      });

      console.log('finalizing zip');
      zip.finalize();
    });
  });
}

const server = new Hapi.Server();
server.connection({port: 3000});

server.route({
  method: 'GET',
  path: '/',
  handler: (request, reply) => {
    foo().then(zip => reply(zip));
  }
})
server.start();

Запустите это с: npm init --yes && npm install hapi archiver sharp request && node index.js

Это создаст конечную точку по адресу http://localhost:3000/, которая не сможет передать поток zip-файла в ответ.

Каждый из них сделает загрузку работающей:

  • Снятие резкой трансформации
  • Замена резких изображений с помощью imagemagick-stream
  • Обработка только одного изображения, т.е. imageStreams.slice(0, 1)

Но я не могу заставить его работать с несколькими изображениями и изменять их размер одновременно.

1 ответ

Решение

Это оказалось ошибкой в ​​острой библиотеке, которая теперь исправлена здесь

Другие вопросы по тегам