`
luoping0425
  • 浏览: 108829 次
  • 性别: Icon_minigender_2
  • 来自: 赣州
文章分类
社区版块
存档分类
最新评论

rails -使用mini_magick和carrierwave进行图片上传

阅读更多
使用mini_magick和carrierwave进行图片上传

相关Gem:
https://github.com/jnicklas/carrierwave
https://github.com/probablycorey/mini_magick

参考实例:https://github.com/diaspora/diaspora/blob/master/app/uploaders/processed_image.rb


示例:用户头像

1. 在项目的Gemfile中添加:
gem 'carrierwave'
gem 'mini_magick'

然后bundle install

如果使用Apache+Passenger,则需要将环境变量传递给passenger
此处应该是查找mini_magick的库
SetEnv PATH /usr/bin:/usr/local/bin,
我们加在apache的项目配置文件中

如:
<VirtualHost *:80>
  ServerName eva 
  DocumentRoot /Users/P.Luo/vhosts/eva/public
  SetEnv RootEnv eva 
  RailsEnv development
  RackEnv development
  SetEnv PATH /usr/bin:/usr/local/bin  
  <Directory "/Users/P.Luo/vhosts/eva/public">
    AllowOverride all 
    Options -MultiViews
    Allow from all 
  </Directory>
</VirtualHost>

参考:http://groups.google.com/group/phusion-passenger/browse_thread/thread/c79eb458c69abd89?pli=1


2. $ rails generate model User nickname:string avatar:string

生成migration、数据表:
class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :nickname
      t.string :avatar

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

$ rake db:migration

3. 生成uploader:
$ rails generate uploader Avatar
这样会生成文件:app/uploaders/avatar_uploader.rb

a. 修改头像文件存储位置:
def store_dir
  “uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}”
end

b. 添加头像版本:
version :thumb do
  process :resize_to_fill => [50, 50]
end

version :normal do
  process :resize_to_fill => [180, 180]
end

version :original


其中process后面的参数可为:resize_to_fill, resize_to_fit, resize_to_limit,其中resize_to_fill如果图片过大是会将图片截取,resize_to_fit则不会截取,而是通过较长长或宽同比例压缩,resize_to_limit就没有研究了。
最后一个版本versionriginal看了一下生成的图片文件,原本就有原大小的文件,所以其实可以不用这个版本。
c. 修改文件名
一般上传的文件名需要修改,此处使用加密原文件名的方法。
def filename
  if @filename
    Digest::SHA1.hexdigest(original_filename) + File.extname(@filename)
  end	
end

此处开始使用的是:
Time.now.to_i.to_s + File.extname(@filename)

发现生成不同版本时会取不同的filename,所以无法使用时间戳或随机数。

4. 修改app/models/user.rb:
class User < ActiveRecord::Base
  mount_uploader :avatar, AvatarUploader
end

5. 创建用户页面app/views/users/_form.html.erb:
<%= form_for(@user, :html => {:multipart => true }) do |f| %>
  <div class="field">
    <%= f.label :nickname %><br />
    <%= f.text_field :nickname %>
  </div>
  <div class="field">
    <%= f.label :avatar %><br />
    <%= image_tag(@user.avatar_url(:thumb)) if @user.avatar? %>
    <%= f.file_field :avatar %>
    <%= f.hidden_field :avatar_cache %>
  </div>
  <div class="field">
    <%= f.label :remove_avatar %><br />
    <%= f.check_box :remove_avatar %>
    Remove Avatar
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

此处的remove_avatar为单独的删除头像,切不可同时上传头像。

6. 在Controller中,不需做任何处理,只是普通的保存就OK。
一般情况下,我们是上传头像后,直接由后台删除原有的图片文件。自己写的更新是:
def update
    @user = User.find params[:id]
    if params[:user][:avatar] && @user. avatar
      old_avatar = User.find(params[:id]).avatar  # 重新取user备用
    end

    if @user.update_attributes(params[:user])
      old_avatar.remove! if old_avatar
end
    redirect_to admin_groups_path
  end

这样两次取@user,如果有更新,当保存成功时删除原有图片文件,否则不做处理。
分享到:
评论
1 楼 z2009zxiaolong 2012-09-14  
路由该怎么配,求指教!

相关推荐

    Api-rails5_api_tutorial.zip

    Api-rails5_api_tutorial.zip,了解如何在michael hartl的rails 5教程上构建一个现代api立即在rails应用程序中构建一个api!(Rails 5版本),一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web...

    Agile Web Development with Rails 1-14节_ppt(老师发的修正版)

    Agile Web Development with Rails 1-14节_ppt(老师发的修正版)

    awesome-rails-gem-zh_CN, Rails 常用 Gem 列表 - Awesome Rails Gem 中文版.zip

    4. **Paperclip** 和 **CarrierWave**:这两个Gem用于文件上传,支持图片处理和存储服务集成。 5. **Pundit**:轻量级的授权库,用于创建更细粒度的权限控制,相比CanCanCan更简单。 6. **Bootstrap-Sass** 和 **...

    rails-master_TheWeb_rubyrails_

    Rails is a web-application framework that includes everything needed to create database-backed web applications according to the Model-View-Controller (MVC) pattern.

    rails-carrierwave-s3:使用 Rails 中的 Carrierwave 将图像上传到 S3

    使用 Rails 中的 Carrierwave 将图像上传到 S3。 克隆这个 repo,然后运行: bundle install rake db:migrate 之后,您需要从 AWS 获取密钥以上传到 S3。 将这些密钥存储在您的config/secrets.yml文件中。 这是...

    rails-starter:启用了React的基本Rails 6.x应用程序

    该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 组态 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) 组态 EDITOR=vi ...

    Ruby-on-Rails-3.rar_site:www.pudn.com

    这本书详细介绍了使用Ruby on Rails框架进行敏捷Web开发的相关知识。 Ruby on Rails(简称Rails)是一种基于Ruby编程语言的开源Web应用框架,它遵循“Don't Repeat Yourself”(DRY)原则,强调简洁、高效的代码...

    inspinia admin - v2.5 Rails_Full_Version

    8. **Asset Pipeline**:Rails的静态资源管理机制,包括CSS、JS和图片的编译、压缩和版本控制。 9. **Heroku或Capistrano部署**:学会如何将Rails应用部署到生产环境,如Heroku云平台或使用Capistrano进行自动化...

    Ruby-on-Rails-rails.zip

    Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zip Ruby_on_Rails_rails.zipRuby_on_...

    rails-dev-box, 面向 Ruby on Rails 核心开发的虚拟机.zip

    rails-dev-box, 面向 Ruby on Rails 核心开发的虚拟机 用于 Ruby on Rails 核心开发的虚拟机简介注意:这个虚拟机不是为 Rails 应用程序开发而设计的,只是为。 这个项目自动设置开发环境,以便在 Ruby on Rails ...

    Rails101_by_rails4.0

    《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...

    rails-settings-ui:用于在Rails应用程序中管理设置的用户界面(使用rails-settings gem)ИнтерфейсдляуправлениянастройкамивRailsприложении

    Rails设置界面 一个Rails Engine来管理您的应用程序设置。 包括验证。 与Rails 5兼容。它与 gem兼容。 预习: 实时示例: : 如何添加到Gemfile gem 'rails-settings-ui'然后加gem 'rails-settings-cached'要么gem '...

    agile-web-development-with-rails_2

    Rails 2相较于早期版本,在多个方面进行了改进和完善: - **性能优化:** 包括内存管理和查询执行等方面的改进,提高了应用程序的运行效率。 - **安全性增强:** 强化了安全机制,例如防止SQL注入和跨站脚本攻击等。...

    2-Rails-sample_app

    通过深入研究这个样本应用,初学者可以了解Rails的全貌,学习如何组织代码、设置路由、处理表单和响应、以及如何利用Rails的强大功能进行高效开发。同时,这也是一个实践和理解MVC设计模式的好机会。

    Api-api_on_rails.zip

    Api-api_on_rails.zip,学习使用rubyonrails5/6构建api的最佳实践学习使用rubyonrails5/6构建api的最佳实践。本书的目的不仅仅是教你如何用rails构建api。目的还在于教您如何用rails构建可伸缩和可维护的api,这意味...

    Rails-JS-Project_TrainingSessions

    "Rails-JS-Project_TrainingSessions" 是一个关于使用Ruby on Rails框架与JavaScript技术进行项目开发的训练课程。这个训练课程可能包含了一系列的教程、代码示例和练习,旨在帮助开发者提升在Rails环境下构建交互式...

    polymer-rails-forms

    ##安装首先按照司仪的安装说明进行操作gem install polymer-rails-formrake polymer_rails_forms:install然后在您的 /app/assets/components/application.html 文件中添加*= require rails-forms/rails-form##...

    administrate-field-active_storage:在administrate中支持活动存储

    将administrate-field-active_storage和mini_magick到您的Gemfile中(第6条): gem 'administrate-field-active_storage' gem "image_processing" 对于rails 5.x,请使用以下命令 gem 'administrate-f

    rails-react-test:使用react-rails和docker测试Rails应用程序

    Rails Docker示例该应用程序的Docker设置来自以下: :入门要开始运行: docker-compose build 然后运行: docker-compose up 要连接到正在运行的应用程序容器,请运行: docker exec -it restarone_app /bin/sh 可以...

    inspinia admin - v2.5 Rails_Seed_Project

    《Inspinia Admin - v2.5 Rails Seed Project:打造高效后台管理的全面解析》 在Web开发领域,后台管理界面的设计与实现是一项至关重要的任务,它直接影响到开发者的工作效率和用户体验。Inspinia Admin是一款广受...

Global site tag (gtag.js) - Google Analytics