如何 运行 对可读的 http 流进行锐化转换并写入文件
How to run Sharp transform on readable http stream and write toFile
这个问题是关于节点Sharp库的http://sharp.pixelplumbing.com/en/stable/api-input/
构造函数的文档说,如果将图像数据通过管道传输到尖锐的物体中,它可以从流中读取图像数据。 "JPEG, PNG, WebP, GIF, SVG, TIFF or raw pixel image data can be streamed into the object when not present."
我正在尝试将来自 GCS 的 HTTP GET 的可读流通过管道传输到转换中,然后使用 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
基本上 returns 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)
Update:我尝试使用 File.download
代替,这很有效。因此,要么我在将流传输到 sharp 时遗漏了一些东西,要么 sharp 有错误。
您可能会发现 Google 中的这个示例很有用,它使用 sharp 缩略图并将其放入存储桶
https://github.com/firebase/functions-samples/blob/master/image-sharp/functions/index.js
这个问题是关于节点Sharp库的http://sharp.pixelplumbing.com/en/stable/api-input/
构造函数的文档说,如果将图像数据通过管道传输到尖锐的物体中,它可以从流中读取图像数据。 "JPEG, PNG, WebP, GIF, SVG, TIFF or raw pixel image data can be streamed into the object when not present."
我正在尝试将来自 GCS 的 HTTP GET 的可读流通过管道传输到转换中,然后使用 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
基本上 returns 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)
Update:我尝试使用 File.download
代替,这很有效。因此,要么我在将流传输到 sharp 时遗漏了一些东西,要么 sharp 有错误。
您可能会发现 Google 中的这个示例很有用,它使用 sharp 缩略图并将其放入存储桶
https://github.com/firebase/functions-samples/blob/master/image-sharp/functions/index.js