此问题与节点Sharp库http://sharp.pixelplumbing.com/en/stable/api-input/有关
该构造函数的文档说明,如果将流通过管道传输到sharp对象中,则它可以从流中读取图像数据。JPEG、PNG、WebP、GIF、SVG、TIFF或原始像素图像数据可以在不存在时流式传输到对象中。
我尝试将来自GCS的HTTP GET的可读流通过管道传输到转换中,然后使用toFile
在文件中获取转换后的图像。我从夏普得到一个错误,表明它没有得到正确的图像数据输入。下面是执行此工作流的函数的一部分代码。
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对象上的File.createReadStream
。我已经在脚本中测试了这个GET调用,它工作正常。GoogleCloudStorage.POST
使用File.createWriteStream
并将传递的可读流通过管道传输到它。因此它需要接收一个可读的流,这就是为什么我尝试将sharp转换写入file。
我得到的错误输出:
[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条答案
按热度按时间u59ebvdq1#
你可能会发现这个来自Google的示例很有用,它使用Sharp来缩略图像并将其放入桶中
https://github.com/firebase/functions-samples/blob/69b829af5494e7c8104f7f3d10a1496bb773d3e2/image-sharp/functions/index.js
vnjpjtjt2#
链接已过时。这是Chris在2018年2月提到的链接。
https://github.com/firebase/functions-samples/blob/69b829af5494e7c8104f7f3d10a1496bb773d3e2/image-sharp/functions/index.js