所以我想做的是从网址中流式传输图像,用graphicsmagick处理并将其流式传输到s3。我只是不工作。
将处理后的图像流式传输到本地磁盘(使用fs.createWriteStream)可以正常工作。
当我缓冲流时,s3中的最终图像至少具有预期的大小(以kb为单位),但是我无法打开该图像。
那就是我当前的进度:
var request = require('request');
var gm = require("gm");
var AWS = require('aws-sdk');
var mime = require('mime');
var s3 = new AWS.S3();
gm(request('http://www.some-domain.com/some-image.jpg'), "my-image.jpg")
.resize("100^", "100^")
.stream(function(err, stdout, stderr) {
var str = '';
stdout.on('data', function(data) {
str += data;
});
stdout.on('end', function(data) {
var data = {
Bucket: "my-bucket",
Key: "my-image.jpg",
Body: new Buffer(str, 'binary'), // thats where im probably wrong
ContentType: mime.lookup("my-image.jpg")
};
s3.client.putObject(data, function(err, res) {
console.log("done");
});
});
});
我确实尝试了一些诸如创建filewritestream和filereadstream的工作,但是我认为应该有一些更清洁的解决方案来解决该问题…
编辑:我尝试的第一件事是将Body设置为stdout(来自@AndyD的建议答案):
var data = {
Bucket: "my-bucket",
Key: "my-image.jpg",
Body: stdout,
ContentType: mime.lookup("my-image.jpg")
};
但是返回以下错误:
Cannot determine length of [object Object]'
编辑2:
完整的错误:
{ [Error: Cannot determine length of [object Object]]
message: 'Cannot determine length of [object Object]',
object:
{ _handle:
{ writeQueueSize: 0,
owner: [Circular],
onread: [Function: onread] },
_pendingWriteReqs: 0,
_flags: 0,
_connectQueueSize: 0,
destroyed: false,
errorEmitted: false,
bytesRead: 0,
_bytesDispatched: 0,
allowHalfOpen: undefined,
writable: false,
readable: true,
_paused: false,
_events: { close: [Function], error: [Function: handlerr] } },
name: 'Error' }
您不需要自己读取流(在您的情况下,由于var str =’‘,您似乎正在从二进制转换为字符串然后返回),然后附加作为二进制缓冲区的数据等。
尝试让putObject像这样通过流传输流:
gm(request('http://www.some-domain.com/some-image.jpg'), "my-image.jpg")
.resize("100^", "100^")
.stream(function(err, stdout, stderr) {
var data = {
Bucket: "my-bucket",
Key: "my-image.jpg",
Body: stdout
ContentType: mime.lookup("my-image.jpg")
};
s3.client.putObject(data, function(err, res) {
console.log("done");
});
});
});
有关更多信息,请参见这些发行说明。
如果流/管道不起作用,则可能会发生类似这样的情况,将所有内容加载到内存中然后上载。在这种情况下,我认为您只能使用4Mb。
var buf = new Buffer('');
stdout.on('data', function(data) {
buf = Buffer.concat([buf, data]);
});
stdout.on('end', function(data) {
var data = {
Bucket: "my-bucket",
Key: "my-image.jpg",
Body: buf,
ContentType: mime.lookup("my-image.jpg")
};
s3.client.putObject(data, function(err, res) {
console.log("done");
});
});
问题内容: 我正在尝试将调整大小的图像上传到S3: 但我得到一个错误: 问题答案: 您需要先将输出图像转换为一组字节,然后才能上载到s3。您可以将图像写入文件然后上传文件,也可以使用cStringIO对象来避免写入磁盘,就像我在这里所做的那样:
问题内容: 我在教授的申请中使用的是查看学生名单的位置,其中将包含照片和其他详细信息以及删除选项。我试图仔细做的所有事情。但是存在一个问题,即来自Firebase的照片无法加载到。有时它会加载一两张照片,然后停止加载照片。我正在加载应用程序时观察android Studio上的“运行”选项。然后我发现类似… 为什么这个问题发生在我身上,我真的还没有。拜托,帮我摆脱这个问题。 在寻找了很多东西之后,
问题内容: 我有一个快速的问题,我不太确定要进行设置。我在其他地方看到过示例,但没有什么比我的情况更具体。我想使用PHP调整图像的大小,以使图像易于阅读,而不仅仅是像使用HTML那样随意拉伸。如果它们的宽度不是250像素,也不是160像素,那么如何调整图片的大小,使其成比例但适合该空间? 谢谢! 问题答案: 好的,下面是我在商店中使用的Image对象。保持规模-需要GD 我在请求时调整图像的大
我已经成功上传图像到我的数据库,但现在我需要我添加的每个图像的缩略图。我似乎无法调整大小和存储图像作为一个单独的文件在我的webroot/img/缩略图文件夹。 我需要上传一个文件,在后端它应该裁剪/调整图像大小,并将该图像以及原始图像存储在数据库中。下面是我在表单上按submit时的控制器功能。 没有错误。它只是不保存到数据库
问题内容: 我一直在搜索google,只遇到过降低高度/宽度或通过CoreImage如何编辑UIImage外观的库。但是我还没有看到或找到一个库,这篇文章解释了如何减小图像大小,因此在上载时,它不是完整的图像大小。 到目前为止,我有这个: 并且正在发送12MB的照片。如何将其减小到1mb?谢谢! 问题答案: Xcode 9•Swift 4或更高版本 编辑/更新:对于iOS10 +,我们可以使用UI
问题内容: 我发现了一些不同的帖子,甚至关于stackoverflow的问题都回答了这个问题。我基本上正在实现与此职位相同的事情。 所以这是我的问题。上传照片时,我还需要提交表单的其余部分。这是我的html: 以前,我不需要调整图像大小,因此我的JavaScript看起来像这样: 所有这些都很好用…现在我需要调整图像的大小…如何替换表单中的图像,以便发布调整大小的图像而不是上传的图像? 我曾考虑过