ruby on rails 实现图片上传

wohaizai007 2011-01-27 10:49:52
前几天做了一个图片上传功能,单独做的时候做出来了,但是和别的控制器绑定在一起就乱了,比如说一个学生对应几个图片,做了数据库链接,一对多的关系,应该怎样设置才能一次传多张图片呢,可以给我传个实例吗?
...全文
567 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
凝然 2011-12-22
  • 打赏
  • 举报
回复
实现多张图片上传与图片预览的方法相似,都是通过发送消息给方法,然后该方法渲染某个div以达到添加一个file_field控件的目的。而不同点在于预览时如何判断是哪个file_filed发过来的消息,这样才能渲染到相应的预览区域内。这里我们通过一个变量@file_id来传递,各个渲染的区域ID也用@file_id来表示。如:

<div id = "file_field_<%= @file_id %>">
<%= file_field_tag("attachment[#{@file_id}][]", :onchange => "this.form.action = '#{url_for :controller => 'myblog', :action => 'project_image_preview', :file_id => @file_id }';this.form.submit();", :size =>50) %>
</div>
<div id = 'image_preview_<%= @file_id %>'></div>
<div id = "delete_button_<%= @file_id %>"></div>

最重要的就是如何接收到文件,上面用了一个数组attachment,接收时key = params[:file_id], file = params["attachment"][key].first这样就取得了文件,接着就可以对预览区渲染了。
另外,在保存多张图片时也要注意,首先利用迭代判断每个上传区域是否有文件,然后保存。

def self.upload(file_array, id)
#进来file_array形式是hash{1=> 'file1',2 => 'file2'}
file_path = "#{RAILS_ROOT}/public/images/uploaddata/#{id}/"
pp file_path
if !File.exist?(file_path)
Dir.mkdir(file_path, 0777)
end
file_array.each do |key,value| # 迭代保存
file = value[0]
original_name = file.original_filename
save_name = UUIDTools::UUID.random_create.to_s[0,4] + original_name
if file.present? # 判断文件是否存在
file_name = file_path + save_name
if File.exist?(file_name)
File.delete(file_name)
end
File.open(file_name,"wb") do |f|
f.write(file.read)
end
end

2,763

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ruby/Rails
社区管理员
  • Ruby/Rails社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧