第十六章补遗(十)

第十六章补遗(十)

第七部分 Streaming --- 流


发送文件和流到浏览器而不是提交的方法。

1、send_data(data, options = {}) 发送二进制数据给用户做为一个文件下载 。可以设置内容类型,出现的文件名,并可指定是以内联方式显示数据还是作为一个附件下载。

Options:

:filename – 建议浏览器使用的文件名。

:type – 指定一个HTTP content 类型。缺省是 ‘application/octet-stream’。

:disposition – 指定文件是内联显示还是下载。有效的值是‘inline’ 和 ‘attachment’ (缺省值)。

通常的数据下载:

send_data buffer

下载动态生成的tarball:

send_data generate_tgz('dir'), :filename => 'dir.tgz'

在浏览器内显示一个图像活动记录:

send_data image.data, :type => image.content_type, :disposition => 'inline'

2、send_file(path, options = {}) 每次以4096比特用流发送文件。此方式不需要一次读入整个文件。这就可以用来送大型文件。

当心,要对来自一个Web页的path参数进行清理。send_file(@params[‘path’]) 允许一个怀有恶意的用户下载你的服务器上的任何文件。

Options:

:filename – 建议浏览器使用的文件名。默认值是File.basename(path)。

:type -指定一个HTTP content 类型。缺省是 ‘application/octet-stream’。

:disposition - 指定文件是内联显示还是下载。有效的值是‘inline’ 和 ‘attachment’ (缺省值)。

:stream – 是否发送文件给用户代理,以在发送前可读取整个文件。默认值为true。

:buffer_size – 指定用于文件流的缓冲区大小(按 bytes)。默认值为4096。

许多浏览器上缺省的Content-Type 和 Content-Disposition headers 被设置成下载任意的二进制文件。IE 的 4, 5, 5.5, 和 6 版本有特殊变化 (尤其是下载 SSL)。

简单的下载:

send_file '/path/to.zip'

在浏览器内显示JPEG :

send_file '/path/to.jpeg', :type => 'image/jpeg', :disposition => 'inline'

如果你想提供给用户更多的信息,可读取其它的Content-* HTTP headers (例如 Content-Description)。 www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11

也要小心文档可以由代理和浏览器缓存。Pragma 和 Cache-Control headers 声明文件如何被媒介缓存。默认是请求客户端在释放缓存应答前对服务器进行确认。查阅 www.mnot.net/cache_docs/中用于web缓存的信息,及用于Cache-Control header的信息在www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9 。

posted @ 2007-02-17 10:59  海浪~~  阅读(129)  评论(0)    收藏  举报