锁定老帖子 主题:Rails中如何更加优雅的处理文件上传
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-19
通常,在rails中处理文件上传,我们会这么做,在view中生成相应html tag: <input name="my_uploaded_file" type="file"> 然后,在controller中,我们可以通过params[:my_uploaded_file]得到上传文件,进行相应处理。 module ActionController class AbstractRequest class << self alias_method :_original_read_multipart_, :read_multipart def read_multipart(body, boundary, content_length, env) params = _original_read_multipart_(body, boundary, content_length, env) file_data = params.values.dup.flatten.select do |form_data| form_data.respond_to?(:original_path) && !form_data.original_path.blank? end params.merge!({"file_data[]" => file_data}) end private :_original_read_multipart_, :read_multipart end end end 我先大致解释下这段代码:在view中的某个form中,当你加入{:multipart => true}参数,rails会调用AbstractRequest中的私有类方法read_multipart,得到form中所有的参数。所以,我的解决方案就是截获此方法,调用原始版本后,遍历form中的所有值,将所有上传的文件放到一个file_data中去,塞回params中。这样,在controller中,就可以通过params[:file_data]得到form中所有上传文件进行处理,而并不用理会input的name到底是什么。这样做,我们甚至可以处理这种情况: <input name="same_name" type="file"> <input name="same_name" type="file"> 就算这两个input的名字相同,通过file_data,仍然可以得到两个文件。这样,controller得到上传文件的代码便独立了,和view没有任何关系,你爱咋写name都行。另外,这行代码有两个地方值得注意: params.merge!({"file_data[]" => file_data}) 1. 关于key,不能想当然的用:file_data[]。因为rails内部处理参数的时候,调用了key.include?,所以,使用Symbol必然出错。 class CGI #:nodoc: module QueryExtension alias_method :_original_read_multipart_, :read_multipart def read_multipart(boundary, content_length) params = _original_read_multipart_(boundary, content_length) file_data = params.values.dup.flatten.select do |form_data| form_data.respond_to?(:original_path) && !form_data.original_path.blank? end params.merge!({"file_data[]" => file_data}) end private :_original_read_multipart_, :read_multipart end end 2008.7.19 22:22 星期六 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-07-20
越发的感到:让rails处理图片简单一点吧!
http://www.iteye.com/topic/214661 |
|
返回顶楼 | |
浏览 3160 次