Как запустить преобразование 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 года.