【发布时间】:2012-10-29 21:05:56
【问题描述】:
我正在尝试将文件中的图像数据作为 base64 字符串存储到 PostgreSQL 数据库中,该字符串由 gzip 压缩以节省空间。我正在使用以下代码对图像进行编码:
@file = File.open("#{Rails.root.to_s}/public/" << @ad_object.image_url).read
@base64 = Base64.encode64(@file)
@compressed = ActiveSupport::Gzip.compress(@base64)
@compressed.force_encoding('UTF-8')
@ad_object.imageData = @compressed
当我尝试保存对象时,出现以下错误:
ActiveRecord::StatementInvalid (PG::Error: ERROR: invalid byte sequence for encoding "UTF8": 0x8b
在 rails 控制台中,任何 gzip 压缩都将数据输出为 ASCII 8 位编码。我尝试将我的内部和外部编码设置为 UTF-8,但结果没有改变。如何将此压缩数据转换为 UTF-8 字符串?
【问题讨论】:
-
首先,您是否要对已压缩的编码进行编码?第二个 base64 完全包含在 ASCII 中,而 ASCII 本身包含在 UTF-8 中。您不需要将其编码为 UTF-8。
-
你有理由这样做吗? PostgreSQL 可以直接将二进制数据存储在
bytea列中,JPEG 和PNG 等常见图像格式不值得gzip-ing;我尝试尽可能少地分层附加编码,在这种情况下为零。 -
如果您确实需要这样做,请在应用 Base64 编码之前应用压缩(如果值得的话)。压缩数据将不是有效的 UTF-8,除非可能是偶然的。
-
图像是使用 CarrierWave gem 上传然后读取的。压缩的原因是因为图像数据将被发送到设备,我想尽量减少发送的数据量。我尝试了压缩,然后是 base64 编码,但生成的字符串是压缩前编码的两倍。
-
Base64 将比二进制文件大得多。它仅在通过文本协议(如用于电子邮件的 smtp)传输数据时有用