此node.js代码块的目的是下载图像,调整大小,将调整大小的图像上传到s3,然后将原始图像上传到s3。
非工作代码:
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributesForElementsInRect = super.layoutAttributesForElements(in: rect)
var newAttributesForElementsInRect = [UICollectionViewLayoutAttributes]()
// use a value to keep track of left margin
var leftMargin: CGFloat = 0.0;
for attributes in attributesForElementsInRect! {
let refAttributes = attributes
// assign value if next row
if (refAttributes.frame.origin.x == self.sectionInset.left) {
leftMargin = self.sectionInset.left
} else {
// set x position of attributes to current margin
var newLeftAlignedFrame = refAttributes.frame
newLeftAlignedFrame.origin.x = leftMargin
refAttributes.frame = newLeftAlignedFrame
}
// calculate new value for current margin
leftMargin += refAttributes.frame.size.width + 10
newAttributesForElementsInRect.append(refAttributes)
}
return newAttributesForElementsInRect
}
问题是此代码块未按预期运行。在上面的代码中,s3上传的缩略图始终是空文件。
但是,如果删除第二个s3上传请求,缩略图会神奇地开始正确上传。
工作代码:
http.get(url, function onResponse(res) {
gm(res)
.resize(250,250)
.stream(function(err, stdout, stderr){
if(debug)console.log("Resized "+key+" and created "+key+"_thumb.jpg");
if(err){
console.log("Error resizing image. Message:",err);
}
else{
var data = {
Bucket: 'bucket-name',
Key: key+"_thumb.jpg",
Body: stdout,
ACL: "public-read",
ContentType:"image/jpeg"
};
s3 = new aws.S3()
s3.upload(data, function(err, resp) {
if(debug)console.log(resp);
});
s3=null;
stdout=null;
data=null;
}
});
s3 = new aws.S3()
s3.upload({Bucket:"bucket-name", Key: key+".jpg", ACL:"public-read", ContentType:"image/jpeg" ,Body: res}, function(err,data){
if(debug)console.log(data);
data=null;
});
s3=null;
res=null;
});
为什么我可以在第二个示例中上传缩略图,而不是第一个?
答案 0 :(得分:1)
我明白了。
成功完成http.get后,我使用以下代码创建一个可重用的缓冲区。
res.on('data', function(chunk) {
data.push(chunk);
}).on('end', function() {
var imgbuffer = Buffer.concat(data);
//create thumbnail
//s3.upload thumbnail
//s3.upload original
});