Как запустить преобразование Sharp в читаемом http-потоке и записать в файл

Этот вопрос касается узла библиотеки Sharp http://sharp.pixelplumbing.com/en/stable/api-input/

Документация для конструктора гласит, что он может читать данные изображения из потока, если вы направите их в острый объект. "JPEG, PNG, WebP, GIF, SVG, TIFF или необработанные данные изображения пикселей могут быть переданы в объект, когда его нет".

Я пытаюсь передать поток чтения из HTTP GET из GCS в преобразование, а затем использовать toFile получить преобразованное изображение в файл. Я получаю ошибку от Sharp, указывающую на то, что он не получает данные ввода данных должным образом. Вот код, который является частью функции, которая выполняет этот рабочий процесс.

const avatarId = this.Uuid(),
    sharp = this.Sharp({failOnError: true}),
    instream = this.GoogleCloudStorage.GET(this.GoogleCloudStorage.getName(photo.uri)),
    fileLocation = this.getTempFileLocation()

sharp.rotate().extract({left: x, top: y, width: w, height: w})
if (w > 600) {
    sharp.resize(600, 600, {fastShrinkOnLoad: false})
    w = 600
}

instream.pipe(sharp)
return sharp.jpeg().toFile(fileLocation)
.then( info => {
    console.log('editAvatar: sharp done')
    return this.GoogleCloudStorage.POST( avatarId, this.Fs.createReadStream( fileLocation ), this.getMIMEType(info) )
} )

GoogleCloudStorage.GET в основном возвращается File.createReadStream на облачном хранилище Файловый объект. Я проверил этот вызов GET в сценарии, он работает. GoogleCloudStorage.POST использования File.createWriteStream и направляет пропущенный читаемый поток в него. Следовательно, он должен получить читаемый поток, поэтому я пытаюсь записать резкое преобразование в файл.

Вывод ошибки я получаю:

[02/24/2018 07:41:06.892] Error -- message: Input file is missing or of an unsupported image format -- stack: Error: Input file is missing or of an unsupported image format
events.js:163
      throw er; // Unhandled 'error' event
      ^

Error: Unexpected data on Writable Stream
    at Sharp._write (/code/api/node_modules/sharp/lib/input.js:114:14)
    at doWrite (_stream_writable.js:329:12)
    at writeOrBuffer (_stream_writable.js:315:5)
    at Sharp.Writable.write (_stream_writable.js:241:11)
    at DestroyableTransform.ondata (/code/api/node_modules/readable-stream/lib/_stream_readable.js:612:20)
    at emitOne (events.js:96:13)
    at DestroyableTransform.emit (events.js:191:7)
    at addChunk (/code/api/node_modules/readable-stream/lib/_stream_readable.js:284:12)
    at readableAddChunk (/code/api/node_modules/readable-stream/lib/_stream_readable.js:271:11)
    at DestroyableTransform.Readable.push (/code/api/node_modules/readable-stream/lib/_stream_readable.js:238:10)

Обновление: я экспериментировал с использованием File.download вместо этого, и это работает. Так что я либо что-то упускаю из-за того, что поток в трубу острый, либо в острие есть ошибка.

2 ответа

Решение

Вы можете найти этот образец от Google полезным, он использует резкое для миниатюрного изображения и положить его в корзину

https://github.com/firebase/functions-samples/blob/master/image-sharp/functions/index.js

Ссылка устарела. Это ссылка, на которую Крис ссылается в феврале 2018 года.

https://github.com/firebase/functions-samples/blob/69b829af5494e7c8104f7f3d10a1496bb773d3e2/image-sharp/functions/index.js

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