我是节点和编程,我一直在为此苦苦挣扎......
我想获取 https 响应,使用 graphicsmagick 调整其大小并将其发送到我的 Amazon S3 存储桶。
看起来https res是一个IncomingMessage对象(我找不到任何关于它的信息),而graphicsmagick的stdout是一个Socket。
奇怪的是,我可以使用管道并将这两个发送到具有本地路径的 writeStream,并且 res 和 stdout 都会创建一个漂亮的新调整大小的图像。
我什至可以将 res 发送到 S3(使用 knox)并且它可以工作。
但是标准输出不想去S3:-/
任何帮助将不胜感激!
https.get(JSON.parse(queryResponse).data.url,function(res){
var headers = {
'Content-Length': res.headers['content-length']
, 'Content-Type': res.headers['content-type']
}
graphicsmagick(res)
.resize('50','50')
.stream(function (err, stdout, stderr) {
req = S3Client.putStream(stdout,'new_resized.jpg', headers, function(err, res){
})
req.end()
})
})
诺克斯 - 用于连接到 S3 – https://github.com/LearnBoost/knox图形魔术 - 用于图像处理 - https://github.com/aheckmann/gm
问题在于亚马逊需要事先知道内容长度(感谢DarkGlass)
但是,由于我的图像相对较小,我发现缓冲优先于多部分上传。
我的解决方案:
https.get(JSON.parse(queryResponse).data.url,function(res){
graphicsmagick(res)
.resize('50','50')
.stream(function (err, stdout, stderr) {
ws. = fs.createWriteStream(output)
i = []
stdout.on('data',function(data){
i.push(data)
})
stdout.on('close',function(){
var image = Buffer.concat(i)
var req = S3Client.put("new-file-name",{
'Content-Length' : image.length
,'Content-Type' : res.headers['content-type']
})
req.on('response',function(res){ //prepare 'response' callback from S3
if (200 == res.statusCode)
console.log('it worked')
})
req.end(image) //send the content of the file and an end
})
})
})
您似乎正在从原始图像而不是调整大小的图像中设置内容长度
也许这有帮助
获取流的内容长度
https://npmjs.org/package/knox-mpu
你不应该在那里做req.end()
。通过这样做,您将在流有时间发送图像数据之前关闭流到 S3。发送完所有图像数据后,它将自动end
。