美文网首页ruby on rails
carrierwave上传图片

carrierwave上传图片

作者: kamionayuki | 来源:发表于2015-05-31 10:20 被阅读355次

    Gemfile

    gem 'carrierwave'
    gem 'mini_magick'
    gem 'fog'  #用来在生产环境中上传图片
    
    bundle instal
    

    application.rb中引用carrierwave

    require 'carrierwave'
    require 'carrierwave/orm/activerecord'
    

    Carrierwave自带的生成器,创建一个上传程序

    rails g uploader Picture
    

    要将Picture属性添加到已有的模型中如Micropost,因此要新增加一个字段用来存储图片

    rails g migration add_picture_to_microposts picture:string
    rake db:migrate
    

    Micropost.rb中将模型和图片关联起来

    class Micropost < ActiveRecord::Base
      ...
      #第一个参数对应的是Micropost中的属性字段名,第二个参数是用来上传图片的类名(即刚刚用rails g uploader Picture生成的类)
      mount_uploader :picture, PictureUploader
      ...
    end
    

    在views中,增加可以上传图片的内容

    <%= form_for @micropost, html: {multipart: true} do |f| %>
       ...
      <%= f.file_field :picture %>
    <% end -%>
    

    controller中,允许增加修改picture属性

    def micropost_params
      params.require(:micropost).permit(:content, :picture)
    end
    

    在views中,增加显示图片的内容

    <%= image_tag @micropost.picture.url if @micropost.picture? %>
    

    picture?这个方法是由CarrierWave创建的,返回一个boolean值,具体的方法名取决于在Micropost模型中,对应图片的字段名是什么,如果是tupian',那么CarrierWave会生成一个tupian?`的方法名


    现在可以上传和显示图片了,但还需要做以下的步骤来控制图片的大小和尺寸

    • 控制图片大小
      在服务器端验证
      micropost.rb中增加验证
       validate :picture_size
      
       private
       def picture_size
         if picture.size > 5.megabytes
           errors.add(picture: "不能上传超过5MB的图片")
         end
       end
      
    
     `picture_uploader.rb`中增加白名单
    

    def extension_white_list
    %w(jpg jpeg gif png)
    end

    *在客户端验证*
    

    <%= f.file_field :picture, accept: "image/jpge, image/gif, image/png" %>

      同时增加`javascript`做判断,节省上传时间,减少服务器负载
    

    $('#micropost_pictrue').bind('change',function(){
    picture_size = this.files[0].size/1024/1024
    if(picture_size > 5){
    alert("上传的图片大于5MB,请重新上传")
    }
    })

    - **控制图片显示尺寸**
    要用到`ImageMagick`这个软件
    

    sudo apt-get update
    sudo apt-get install imagemagick --fix-missing

    然后在`picture_uploader.rb`中进行配置
    

    include CarrierWave::MiniMagick
    process resize_to_limit: [400, 400]

    
    
    OK。完成!
    
    
    

    相关文章

      网友评论

        本文标题:carrierwave上传图片

        本文链接:https://www.haomeiwen.com/subject/wfxdqttx.html