NodeJS 如何在可读的http流上运行Sharp转换并写入文件

3qpi33ja  于 2023-06-29  发布在  Node.js
关注(0)|答案(2)|浏览(114)

此问题与节点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做了实验,效果不错。所以要么是我把数据流输到夏普的时候漏了什么,要么就是夏普有问题。

相关问题