今天讲解一下rails的图片上传,就是最平常的上传图片 这里的rails版本2.3.5

本文使用rails + paperclip + aws-sdk3 的简单图片上传

首先新建一个write_pic model内容如下:

  1. 安装依赖
    paperclip这个gem依赖于ImageMagick
    Mac
    brew install imagemagick
    Linux
    sudo apt-get install imagemagick -y
    手动安装
    可以到ImageMagick的官方下载安装包
    or 编译包进行手动安装

  2. 安装gem

复制代码 代码如下:

  • paperclip
    使用gem install paperclip,默认安装最新,如果需要指定版本请在后面加上-v 版本号
    或者在Gemfile文件加上gem "paperclip",再执行bundle
  • S3
    gem install aws-sdk or Gemfile添加gem 'aws-sdk'之后bundle

class WritePic
require “RMagick”
require “uuid”
def self.write(pic_data,ori_name,resize = nil,file_type =
“jpg”,tag=false)
#File.delete(“c:/programData/ruby-uuid”) if RAILS_GEM_VERSION ==
‘2.1.2’
uuid = ori_name || “#{UUID.new.generate}.#{file_type}”
i = Magick::Image.from_blob(pic_金沙城中心赌场 ,data).first
if resize
p=resize[:width].to_i*1.00 /i.columns
i.resize!(resize[:width],resize[:height]|| i.rows*p)
end
wh=0
width = i.columns
height = i.rows
if width > height
wh =1
end
i.write(“#{RAILS_ROOT}/public/images/user_pic/#{uuid}”)
if tag
return wh,uuid
else
return uuid
end
end
def self.get_pic(url)
uuid = “#{UUID.new.generate}.#{file_type}”
img_orig1 = Magick::Image.read(url).first
image1 = img_orig1.resize_to_fit(300,300)
image1.write(“#{RAILS_ROOT}/public/images/weibo_pic/#{uuid}”)
return uuid
end
end

  1. rails保存图片
    ok,我们的准备工作已经完成,接下来让我们写图片保存的核心
    图片信息需要挂在一个model上
    rails g model user
    ok,然后就是保存图片的信息字段
    rails g paperclip user avatar
    它会在db的迁移文件中生成这几个字段

上传 图片是用的插件所以最上面加载了插件。

调用write_pic 这个model的model文件写法如下

class AddAvatarColumnsToUsers < ActiveRecord::Migration
  def up
    add_attachment :users, :avatar
    # === 生成的 db column ===
    # avatar_file_name
    # avatar_file_size
    # avatar_content_type
    # avatar_updated_at
  end

  def down
    remove_attachment :users, :avatar
  end
end

复制代码 代码如下:

执行迁移rake db:migrate
db完成之后,接下来就是在model层做好s3的配置

class Theme < ActiveRecord::Base
require “RMagick”
require “uuid”
def _image=(picture_field)
if picture_field != “”
self.image = WritePic.write(picture_field.read,self.image,nil)
end
end
def _image
self.image
end
def suoluetu=(picture_field)
if picture_field != “”
self.thumbnail =
WritePic.write(picture_field.read,self.thumbnail,nil,”png”)
end
end
def suoluetu
self.thumbnail
end
end

has_attached_file :avatar,
                    :storage => :s3,
                    :s3_credentials => Proc.new{|a| a.instance.s3_credentials }

# your s3 config
def s3_credentials
  {
    :bucket => "xxx", 
    :access_key_id => "xxx", 
    :secret_access_key => "xxx", 
    :s3_region => "us-east-1"
  }
end

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图