在Rails中如何将CSV文件压缩为.gz格式并保存至public目录
在Rails中压缩CSV为.gz并保存到public文件夹
你可以基于Ruby内置的Zlib库实现需求,只需调整路径逻辑,确保压缩后的文件保存到Rails.root/public目录下。以下是优化后的代码:
def compress_csv_to_public(csv_file_name) # 构建原始CSV文件的完整路径(根据你的CSV实际位置调整,示例假设在项目根目录) original_file_path = Rails.root.join(csv_file_name) # 生成public目录下的压缩文件路径,自动去掉CSV后缀 compressed_file_path = Rails.root.join('public', "#{File.basename(csv_file_name, '.csv')}.gz") # 跳过不存在的文件,避免报错 return unless File.exist?(original_file_path) # 打开Gzip写入流,指定最优压缩比 Zlib::GzipWriter.open(compressed_file_path, Zlib::BEST_COMPRESSION) do |gz| # 可选:添加压缩文件注释 gz.comment = "Compressed from #{csv_file_name} at #{Time.now}" # 二进制读取原始文件并写入压缩流,避免编码问题 gz.write IO.binread(original_file_path) end compressed_file_path end
关键说明:
- 路径处理:用
Rails.root.join构建绝对路径,适配不同部署环境,避免硬编码路径的问题 - 文件名处理:
File.basename(csv_file_name, '.csv')自动移除原始CSV的后缀,生成干净的.gz文件名 - 错误预防:加入
File.exist?检查,避免因原始文件不存在引发异常 - 压缩优化:指定
Zlib::BEST_COMPRESSION参数获得更高压缩率(若追求速度可改用Zlib::BEST_SPEED) - 编码安全:使用
IO.binread以二进制模式读取文件,防止CSV中的特殊字符出现编码错乱
调用示例:
# 假设你的CSV文件在项目根目录下叫sales_report.csv compress_csv_to_public('sales_report.csv') # 压缩后的文件会保存到:你的Rails项目根目录/public/sales_report.gz
内容的提问来源于stack exchange,提问作者vikasrb
相关产品推荐
相关产品推荐

