跳转到内容

压缩

使用 gzip、deflate、zlib、brotli 和 zstd 算法压缩和解压数据。

local compress = require("compress")

使用最广泛的格式(RFC 1952)。

-- Compress for HTTP response
local body = json.encode(large_response)
local compressed, err = compress.gzip.encode(body)
if err then
return nil, err
end
-- Set Content-Encoding header
res:set_header("Content-Encoding", "gzip")
res:write(compressed)
-- Maximum compression for storage
local archived = compress.gzip.encode(data, {level = 9})
-- Fast compression for real-time
local fast = compress.gzip.encode(data, {level = 1})
参数类型描述
datastring要压缩的数据
optionstable?可选的编码选项
字段类型描述
levelinteger压缩级别 1-9(默认:6)

返回: string, error

-- Decompress HTTP request
local content_encoding = req:header("Content-Encoding")
if content_encoding == "gzip" then
local body = req:body()
local decompressed, err = compress.gzip.decode(body)
if err then
return nil, errors.new("INVALID", "Invalid gzip data")
end
body = decompressed
end
-- Decompress with size limit (prevent zip bombs)
local decompressed, err = compress.gzip.decode(data, {max_size = 10 * 1024 * 1024})
if err then
return nil, errors.new("INVALID", "Decompressed size exceeds 10MB limit")
end
参数类型描述
datastringGZIP 压缩数据
optionstable?可选的解码选项
字段类型描述
max_sizeinteger最大解压大小(字节)(默认:128MB,最大:1GB)

返回: string, error

文本压缩比最佳(RFC 7932)。

-- Best for static assets and text content
local compressed = compress.brotli.encode(html_content, {level = 11})
-- Cache compressed assets
cache:set("static:" .. hash, compressed)
-- Moderate compression for API responses
local compressed = compress.brotli.encode(json_data, {level = 4})
参数类型描述
datastring要压缩的数据
optionstable?可选的编码选项
字段类型描述
levelinteger压缩级别 0-11(默认:6)

返回: string, error

local decompressed, err = compress.brotli.decode(compressed_data)
if err then
return nil, err
end
-- With size limit
local decompressed = compress.brotli.decode(data, {max_size = 50 * 1024 * 1024})
参数类型描述
datastringBrotli 压缩数据
optionstable?可选的解码选项

选项 {id=“brotli-decompress-options”}

Section titled “选项 {id=“brotli-decompress-options”}”
字段类型描述
max_sizeinteger最大解压大小(字节)(默认:128MB,最大:1GB)

返回: string, error

快速压缩且压缩比良好(RFC 8878)。

-- Good balance of speed and ratio
local compressed = compress.zstd.encode(binary_data)
-- Higher compression for archival
local archived = compress.zstd.encode(data, {level = 19})
-- Fast mode for real-time streaming
local fast = compress.zstd.encode(data, {level = 1})
参数类型描述
datastring要压缩的数据
optionstable?可选的编码选项
字段类型描述
levelinteger压缩级别 1-22(默认:3)
dictstring?来自 train_dict 的 Zstd 字典字节(默认:无)

返回: string, error

local decompressed, err = compress.zstd.decode(compressed_data)
if err then
return nil, err
end
参数类型描述
datastringZstandard 压缩数据
optionstable?可选的解码选项
字段类型描述
max_sizeinteger最大解压大小(字节)(默认:128MB,最大:1GB)
dictstring?Zstd 字典字节(必须与编码所用的字典一致)

返回: string, error

从样本数据训练字典,以提升对大量小型、相似负载的压缩效果。将训练好的字典作为 dict 选项传给 encode/decode——两者必须使用同一字典。

local dict, err = compress.zstd.train_dict(samples, { size = 112640 })
local packed = compress.zstd.encode(data, { dict = dict })
local original = compress.zstd.decode(packed, { dict = dict })
参数类型描述
samplesstring[]训练样本(至少一个 >= 8 字节)
optionstable?size(integer,目标字典字节数,256-1048576,默认 114688)、id(integer,默认 0)、level(integer,1-22)

返回: string, error(字典字节)

参数类型描述
dictstring字典字节

返回: table, error——{id: integer, content_size: integer}

原始 DEFLATE 压缩(RFC 1951)。被其他格式内部使用。

local compressed = compress.deflate.encode(data, {level = 6})
参数类型描述
datastring要压缩的数据
optionstable?可选的编码选项

选项 {id=“deflate-compress-options”}

Section titled “选项 {id=“deflate-compress-options”}”
字段类型描述
levelinteger压缩级别 1-9(默认:6)

返回: string, error

local decompressed = compress.deflate.decode(compressed)
参数类型描述
datastringDEFLATE 压缩数据
optionstable?可选的解码选项

选项 {id=“deflate-decompress-options”}

Section titled “选项 {id=“deflate-decompress-options”}”
字段类型描述
max_sizeinteger最大解压大小(字节)(默认:128MB,最大:1GB)

返回: string, error

带有头部和校验和的 DEFLATE(RFC 1950)。

local compressed = compress.zlib.encode(data, {level = 6})
参数类型描述
datastring要压缩的数据
optionstable?可选的编码选项
字段类型描述
levelinteger压缩级别 1-9(默认:6)

返回: string, error

local decompressed = compress.zlib.decode(compressed)
参数类型描述
datastringZlib 压缩数据
optionstable?可选的解码选项
字段类型描述
max_sizeinteger最大解压大小(字节)(默认:128MB,最大:1GB)

返回: string, error

算法适用场景速度压缩比级别范围
gzipHTTP,广泛兼容中等良好1-9
brotli静态资源,文本最佳0-11
zstd大文件,流式传输良好1-22
deflate/zlib底层,特定协议中等良好1-9
-- HTTP response based on Accept-Encoding
local accept = req:header("Accept-Encoding") or ""
local body = json.encode(response_data)
if accept:find("br") then
res:set_header("Content-Encoding", "br")
res:write(compress.brotli.encode(body))
elseif accept:find("gzip") then
res:set_header("Content-Encoding", "gzip")
res:write(compress.gzip.encode(body))
else
res:write(body)
end
条件类型可重试
空输入errors.INVALID
级别超出范围errors.INVALID
无效的压缩数据errors.INVALID
解压大小超过限制errors.INTERNAL

参见 错误处理 了解错误处理方法。