Как сделать сокет потоком? Чтобы подключить https ответ на S3 после imagemagick
Я занимаюсь нодом и программированием в целом, и я действительно боролся с этим...
Я хочу получить ответ https, изменить его размер с помощью graphicsmagick и отправить его в мое хранилище amazon S3.
Похоже, что https res является объектом IncomingMessage (я не могу найти никакой информации об этом), а stdout от graphicsmagick - это Socket.
Странная вещь заключается в том, что я могу использовать pipe и отправить оба этих файла в 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()
})
})
knox - для подключения к S3 - https://github.com/LearnBoost/knox graphicsmagick - для работы с изображениями - https://github.com/aheckmann/gm
3 ответа
Проблема была в том, что Amazon нужно заранее знать длину контента (спасибо DarkGlass)
Однако, так как мои изображения относительно малы, я обнаружил, что буферизация предпочтительнее MultiPartUpload.
Мое решение:
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
})
})
})
Вы, кажется, устанавливаете Content-Length из исходного изображения, а не измененное
Может быть, это помогает
Вы не должны делать req.end()
там. Сделав это, вы закроете поток на S3, прежде чем он успеет отправить данные изображения. Будет end
Сам автоматически, когда все данные изображения были отправлены.