ImageKit本地运行正常,部署到Heroku后生成0字节图片求助
首先看你的代码:
puts "Uploading image #{@game_id}" kit = IMGKit.new(@game_url, quality: 50) image_data = kit.to_png obj = S3.object(File.join(@bucket_path, "#{@game_id}.png")) obj.put(body: image_data, acl: 'public-read', content_type: 'image/png') puts " ------------- image uploaded successfully -------------- "
本地正常但Heroku上生成空图片,核心原因基本出在图片生成环节(上传逻辑能执行但传了空数据),按以下方向排查:
缺失wkhtmltoimage依赖:IMGKit依赖wkhtmltoimage工具渲染页面生成图片,Heroku默认环境未预装该工具。需给Heroku添加对应的buildpack(比如
heroku-buildpack-wkhtmltopdf),添加后重新部署,确保工具可正常调用。@game_url无法被Heroku访问:如果@game_url指向本地服务(如localhost)或内网地址,Heroku的dyno服务器无法抓取页面内容,自然生成空图片。确认@game_url是公网可访问地址,或Heroku能连通的内部服务地址(比如同应用路由要使用Heroku分配的域名,而非localhost)。
未捕获生成异常:代码未处理IMGKit生成图片时的错误,即使生成失败(如页面加载超时、渲染错误),仍会上传空的image_data。添加异常捕获并输出日志:
begin kit = IMGKit.new(@game_url, quality: 50) image_data = kit.to_png rescue => e puts "Image generation failed: #{e.message}" # 可在此添加告警或终止上传的逻辑 end再通过
heroku logs --tail查看具体错误信息,定位问题。资源或超时限制:Heroku免费/基础dyno的内存、CPU有限,若@game_url对应页面元素多、加载慢,可能导致IMGKit渲染超时或被系统终止,返回空数据。可尝试降低图片质量(比如把quality设为30)、添加
timeout: 10限制页面加载时间,或升级dyno类型。版本兼容性问题:本地使用的IMGKit版本和wkhtmltoimage版本,可能与Heroku上安装的版本不兼容,导致渲染失败。检查本地和Heroku的依赖版本,确保一致或调整版本匹配。
内容的提问来源于stack exchange,提问作者Jatin Garg

