【发布时间】:2012-11-01 12:06:32
【问题描述】:
我有一个 Node.js 服务器,它从数据库 (mongodb) 中的图像 (640x640) 动态生成并提供小 (200x200) 缩略图。我正在使用node-imagemagick 模块进行缩略图。
我的代码在大约 95% 的时间内都能正常工作;客户端 (iOS) 上大约每 20 个(或更少)缩略图图像损坏,报告:
JPEG 损坏的 JPEG 数据:数据段提前结束
对于损坏的图像,客户端显示图像的前 50% - 75%,其余部分被截断。
行为是不确定的,并且损坏的特定图像会根据每个请求而变化。
我正在使用以下代码来调整图像大小并输出缩略图:
im.resize({
srcData: image.imageData.buffer,
width: opt_width,
}, function(err, stdout) {
var responseHeaders = {};
responseHeaders['content-type'] = 'image/jpeg';
responseHeaders['content-length'] = stdout.length;
debug('Writing ', stdout.length, ' bytes.');
response.writeHead(200, responseHeaders);
response.write(stdout, 'binary');
response.end();
});
这里有什么问题?
注意事项:
【问题讨论】:
-
几个问题:node.js 环境是什么?数据库中的图像是否损坏,还是仅在 iOS 上损坏?你能创建一个测试方法,你可以从浏览器驱动并在插入数据库之前输出调整大小的图像(到磁盘或浏览器)?
-
这种情况在一些不同的环境中始终如一地发生,其中包含各种“最新”版本的 Node、ImageMagick 和 mongodb。一个是 Node.js 版本 v0.9.1-pre (OS X),另一个是 0.8.6 (Ubuntu)。我有理由确定源图像没问题,因为如果我不通过 ImageMagick 运行它,它在 iOS 客户端中总是可以正常显示。
-
情节变厚...当我缓存缩略图(在节点中)以便我可以在调整相同源图像大小时比较输出时,有时存在根本差异(这将与客户端损坏一致)拇指大小。我开始怀疑发送到 IM 的缓冲区不知何故被并发请求阻塞了。
-
是的,并发请求是我的下一个想法。如果你花时间做一个请求,让它完成,然后再做另一个,它是否工作得很好?是并发问题吗?
-
不,也不是这样;我现在在将缓冲区提供给 IM 之前复制缓冲区并获得相同的结果。我还将所有拇指写入磁盘;当我对它们运行“识别”时,没有报告任何问题。 (但那是因为识别只读取标题......)@k00k,我会尝试你的建议并将请求限制为一次。
标签: node.js imagemagick