rails 文件下载相关操作的一些总结
2016-09-28 11:02
399 查看
用rails写一些内部工具的时候, 以前遇到文件下载的相关需求的时候, 都是直接把文件生成到 /public 下面, 但是遇到需要即时生成一堆文件的时候, 这种方式就比较悲剧了,
比如需求要求生成一堆文件, 要一起下载只能生成以后, ZIP 压缩成一个包下载, 但是如果利用文件系统来存储, 管理这些数据, 文件生成一堆不说, 光各种 mv, cp, zip操作就够烦人的了。
rails 提供了很多有用的API来完成文件下载的功能:
[b]1. send_data, send_file 用于文件的下载[/b]
send_data(data, options = {})
send_file(path, options = {})
这2个的区别在于是否在文件系统中生成文件, 应该send_file就是send_data包了一层, 多了从文件系统读取文件这个操作。
send_file例子: IMAGES_PATH = File.join(Rails.root, "public", "images") def download send_file(File.join(IMAGES_PATH, "image.jpg")) end
send_data的一些说明:
send_data的选项有4个,:filename, :type, :disposition, :status :type是发送文件的资源类型, jpeg格式图片: "image/jpeg", docx文档: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" :disposition有2个值:inline或:attachment, 这决定了浏览器的打开方式, 是下载还是在浏览器中打开
send_data例子: send_data zip_data, filename: "#{file_name}.zip", type: 'application/zip', :disposition => 'attachment'[b]
一些额外的说明:[/b][/code]
字符串的 force_encoding 会改变源数据的解释方式, 不过并不会改变源数据, 但是在ruby 1.9 里面发送数据需要force_encoding('BINARY'), 但是我在2.x 里面没用这个文件也发送成功了, 没出什么问题。 a = "Ü" a.bytes.to_a #=> [195, 156] a.chars.to_a #=> ["Ü"] a.force_encoding("BINARY") a.bytes.to_a #=> [195, 156] a.chars.to_a #=> ["\xC3", "\x9C"
[b]2. 生成csv文件不经过文件系统, 直接用 send_data 来发送到客户端[/b]
ruby 的CSV库, 2种方式生成csv文件, 第一种方式生成了 csv 文件后直接保存到文件系统中, 第二种方式直接生成一个csv_string。 这个时候就可以用send_data直接发送数据了。 CSV.open("path/to/file.csv", "wb") do |csv| csv << ["row", "of", "CSV", "data"] csv << ["another", "row"] # ... end
csv_string = CSV.generate do |csv| csv << ["row", "of", "CSV", "data"] csv << ["another", "row"] # ... end
send_data csv_string, :filename => '你看见了一个csv文件.csv', :type => "text/comma-separated-values", :disposition => "attachment" [b]3. 生成csv文件, 直接生成ZIP文件, 直接用 send_data 发送到客户端 [/b]
compressed_filestream = Zip::OutputStream.write_buffer(::StringIO.new('')) do |zos| zos.put_next_entry "第一个文件的名字" zos.print File.read('path') zos.put_next_entry "第二个文件的名字" zos.print file_string end compressed_filestream.rewind return compressed_filestream.read
然后返回的数据直接用send_data发送就好了:
send_data zip_data, filename: "#{file_name}.zip", type: 'application/zip', :disposition => 'attachment'
相关文章推荐
- EditPlus最新汉化绿色版的下载、破解,以及开发java文件时的一些相关设置操作视频
- C文件操作一些总结
- PHP 操作文件的一些FAQ总结
- PHP文件读写操作相关函数总结
- Android文件操作的一些小总结
- 总结一些linux下对压缩文件操作的命令
- 关于文件流的阅读笔记(文件操作相关总结) [[ 应用过 ]]
- 转 -- OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结
- C语言中操作密码文件的一些函数总结
- PHP文件读写操作相关函数总结
- C#中对文件的上传下载操作总结(下载后点击删除按钮总是提示进程被占用)
- PHP 操作文件的一些FAQ总结
- C文件操作一些总结
- OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结
- php中下载相关header文件类型总结
- 文件操作一些总结
- 关于PHP操作文件的一些FAQ总结
- 关于PHP操作文件的一些FAQ总结
- ★ C文件操作一些总结
- 算法—二叉查找树的相关一些操作及总结