gm(ImageMagick)传入convert字符串参数到in()方法执行失败如何解决
根因
gm库的in()方法要求传入独立的单个参数项,你将所有参数拼接成一个完整字符串传入时,整个字符串会被识别为单个convert命令参数,ImageMagick无法解析自然会忽略无效参数,执行失败。
解决方案
最优方案:直接传递参数数组
Lambda的event参数原生支持数组类型,你不需要将参数转为字符串,直接把参数数组放在event中传递即可,调用时用扩展运算符打散传入in():
const GM = require('gm'); const gm = GM.subClass({ imageMagick: true }); // event.command 直接存储为数组格式:['-resize','800x','-resize','800x','-sharpen','0x.4','-crop','160x180+0+0','+repage','-quality','92'] gm(buf).command('convert').in(...event.command).toBuffer((err, buffer) => err ? reject(err) : resolve(buffer));
该方式没有转义风险,兼容性最好。
兼容方案:字符串格式参数解析
如果你的链路限制只能传递字符串格式的参数,有两种解析方式可选:
- 简单格式解析
适配你当前的"'参数1','参数2'"格式字符串:
const GM = require('gm'); const gm = GM.subClass({ imageMagick: true }); let command = "'-resize','800x','-resize','800x','-sharpen','0x.4','-crop','160x180+0+0','+repage','-quality','92'"; // 先去除所有单引号,按逗号分割后去除每个参数的前后空格 const commandParams = command.replaceAll("'", "").split(",").map(item => item.trim()); gm(buf).command('convert').in(...commandParams).toBuffer((err, buffer) => err ? reject(err) : resolve(buffer));
- 无转义冲突解析
如果参数本身可能包含逗号、单引号,你可以在传递前将参数数组做JSON序列化,Lambda侧再反序列化使用:
// 参数发送侧:序列化数组为字符串 const sendStr = JSON.stringify(['-resize','800x','-resize','800x','-sharpen','0x.4','-crop','160x180+0+0','+repage','-quality','92']); // Lambda侧:反序列化得到参数数组 const commandParams = JSON.parse(event.command); gm(buf).command('convert').in(...commandParams).toBuffer((err, buffer) => err ? reject(err) : resolve(buffer));
内容的提问来源于stack exchange,提问作者vertige
相关产品推荐
相关产品推荐

