我有一个rails 3.1应用程序,它将图像存储在postgresql数据库的二进制字段中(我知道在数据库中存储图像的潜在问题,但现在必须这样做)。在开发模式和OSX上的规格本地一切都很好,但所有图像都在部署到Heroku的应用程序中被破坏。我已经通过将本地计算机指向heroku实例使用的同一数据库并且所有图像都正确显示来验证数据库中的数据是否正确。
所以,问题似乎在于从数据库加载数据的ActiveRecord(在Heroku上运行)。我也猜测这是一个编码问题。在本地运行rails控制台我可以验证这些字段的字节大小是否正确,但在Heroku上运行rails控制台显示错误的字节大小。实际上,在Heroku上通过ActiveRecord加载N字节文件会导致所有文件的字节大小为2N + 1.
非常感谢任何帮助。
答案 0 :(得分:16)
2n + 1的气味就像你从bytea
而不是旧的转义格式获得十六进制输出。我猜你正在使用专用数据库,这意味着PostgreSQL 9.0有一个different default encoding for bytea:
从PostgeSQL 8.x迁移到PostgreSQL 9.x时,您可能遇到二进制字符串兼容性问题。默认表示在版本9中为十六进制,但在版本8中设置为转义。您可以通过手动设置bytea_output来使PostgreSQL 9使用转义。
如果我是对的,您可以使用上述链接中的说明或使用此摘要版本:
DATABASE_URL
中提取PostgreSQL用户名,该用户名看起来像postgres://username:password@host/database_name
。 heroku pg:psql
获取PostgreSQL控制台。ALTER ROLE username SET bytea_output TO 'escape';
控制台执行psql
,当然,username
是(1)中的用户名。psql
执行heroku restart
以重新启动您的应用程序。然后再试一次,希望你能得到正确的字节。