美文网首页ruby on rails
Ruby&Rails---carrierwave图片上传功能

Ruby&Rails---carrierwave图片上传功能

作者: HPD_黄霹雳 | 来源:发表于2017-10-30 18:25 被阅读0次

    添加gem 后 bundle

    gem  'carrierwave'
    

    创建uploader

    会创建app/uploaders/avatar_uploader.rb文件

    bin/rails generate uploader Avatar
    
    图片.png

    avatar_aploader的内容如下:

    class AvatarUploader < CarrierWave::Uploader::Base
    
      # Include RMagick or MiniMagick support:
      # include CarrierWave::RMagick
      # include CarrierWave::MiniMagick
    
      # Choose what kind of storage to use for this uploader:
      # 存储的类型是文件
      storage :file
      # storage :fog
    
      # Override the directory where uploaded files will be stored.
      # This is a sensible default for uploaders that are meant to be mounted:
      # 图片存放的位置
      def store_dir
       "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
      end
    
      # Provide a default URL as a default if there hasn't been a file uploaded:
      # def default_url(*args)
      #   # For Rails 3.1+ asset pipeline compatibility:
      #   # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
      #
      #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
      # end
    
      # Process files as they are uploaded:
      # process scale: [200, 300]
      #
      # def scale(width, height)
      #   # do something
      # end
    
      # Create different versions of your uploaded files:
      # version :thumb do
      #   process resize_to_fit: [50, 50]
      # end
    
      # Add a white list of extensions which are allowed to be uploaded.
      # For images you might use something like this:
      # 图片格式接受白名单
      # def extension_whitelist
      #   %w(jpg jpeg gif png)
      # end
    
      # Override the filename of the uploaded files:
      # Avoid using model.id or version_name here, see uploader/store.rb for details.
      # def filename
      #   "something.jpg" if original_filename
      # end
    
    end
    
    

    默认的图片放置位置是在public/uploads/下,如果要修改这个路径,需要指定上述的 store_dir

    挂载到对应的model上,这边用的是一个avatar字段

    class User < ApplicationRecord
      mount_uploader :avatar, AvatarUploader
    end
    

    到这边配置已经完成了。
    下面是我这边写的一个app通过接口上传头像,然后后台返回该图片的网址,用的是本地服务器。

    APP上传头像到后台接口

     对应的路由  post 'user/upload_avatar'
    
      # 上传头像
      def upload_avatar
        avatar = params[:avatar]
        user = User.find(params[:id])
        # !!! 这句在数据中存储的是文件名:例如:20171026_204107_crop.jpg
        user.avatar = avatar
        if user.save
          render json: {code: 1, usericon: generate_user_avatar_url(user.id), message: "头像上传成功"}
          return
        end
        render json: {code: 2, message: "头像上传失败"}
      end
    
      def generate_user_avatar_url(user_id)
        return "http://#{request.host_with_port}/user/avatar/#{user_id}"
      end
    
    

    获取头像接口

     对应的路由  get 'user/avatar/:id'
    
    
     # 返回用户头像
      def avatar
        id = params[:id]
        user = User.where(id: id).last
        if user==nil
          #默认图
          path = "#{Rails.root}/public/uploads/user/avatar/default_user_icon.png"
        else
          # user.avatar = /uploads/user/avatar/46/da_1509356355185_crop.jpeg
          path = "#{Rails.root}/public#{user.avatar}"
        end
        data = File.read(path)
        send_data(data, type: "image", disposition: "inline")
      end
    

    相关文章

      网友评论

        本文标题:Ruby&Rails---carrierwave图片上传功能

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