我有一个Web应用程序(ruby on rails),它发送一些YAML作为隐藏输入字段的值。
现在我想减少发送到浏览器的文本的大小。在最小数据中发送的最有效的无损压缩形式是什么?我可以在服务器端产生额外的压缩和解压缩成本。
答案 0 :(得分:54)
您可以使用ruby核心中的zlib实现来进/出数据:
require "zlib"
data = "some long yaml string" * 100
compressed_data = Zlib::Deflate.deflate(data)
#=> "x\x9C+\xCE\xCFMU\xC8\xC9\xCFKW\xA8L\xCC\xCDQ(.)\xCA\xCCK/\x1E\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15\x1C\x15D\x15\x04\x00\xB3G%\xA6"
您应该对压缩数据进行base64编码以使其可打印:
require 'base64'
encoded_data = Base64.encode64 compressed_data
#=> "eJwrzs9NVcjJz0tXqEzMzVEoLinKzEsvHhUcFRwVHBUcFRwVHBUcFUQVBACz\nRyWm\n"
稍后,在客户端,您可以使用pako(一个zlib端口到javascript)来恢复您的数据。 This answer可能会帮助您实现JS部分。
为了让您了解这是多么有效,以下是示例字符串的大小:
data.size # 2100
compressed_data.size # 48
encoded_data.size # 66
在客户端上压缩并在服务器上充气时,反之亦然。
Zlib::Inflate.inflate(Base64.decode64(encoded_data))
#=> "some long yaml stringsome long yaml str ... (shortened, as the string is long :)
<强>声明:强>