使用Dragonfly上传Rails图片
文件上传是Web应用程序中的重要功能。 除了使用户能够上传个人资料图片外,文件上传功能的使用也各不相同。 我已经向您展示了如何使用不同的gem在Rails应用程序中启用文件上传。 今天,我将向您展示如何使用Dragonfly执行相同操作。
Dragonfly是一种高度可定制的Ruby gem,用于处理图像和其他附件,并且已经在数千个网站上使用。
您可能被赋予在Rails应用程序中启用文件上传功能的任务,并且可能不想使用那里的其他gem。 您可以试一下蜻蜓,绝对不会后悔。
在本教程中,您将创建一个简单的Rails应用程序。 我叫我的Dragon-Uploader。 该应用程序将仅具有一项功能:图像上传。
安装ImageMagick
要使用蜻蜓,您需要在计算机上安装ImageMagick。 请根据您的操作系统执行以下任何步骤。
Mac用户:
brew install imagemagick
Ubuntu用户:
sudo apt-get install imagemagick
Rails应用程序生成
rails new dragon-uploader -T
-T
选项可确保在没有默认测试套件的情况下生成Rails应用程序。
转到您的Gemfile
并添加dragonfly
gem。
#Gemfilegem 'dragonfly', '~> 1.0', '>= 1.0.12'
不要忘记捆绑。
bundle install
让我们生成我们的控制器。
rails generate controller Photos
整合蜻蜓
将Dragonfly集成到Rails应用程序中的第一步是从终端运行Dragonfly generation命令。
rails generate dragonfly
这将在您的config/initializers
文件夹中为Dragonfly创建一个初始化文件。
该文件如下所示:
#config/intializers/dragonfly.rbrequire 'dragonfly'# Configure
Dragonfly.app.configure doplugin :imagemagicksecret "e83b8affbf1c807c7788c07d27e70e79fb0459f8e2c4375b59e60a3da11631e5"url_format "/media/:job/:name"datastore :file,root_path: Rails.root.join('public/system/dragonfly', Rails.env),server_root: Rails.root.join('public')
end# Logger
Dragonfly.logger = Rails.logger# Mount as middleware
Rails.application.middleware.use Dragonfly::Middleware# Add model functionality
if defined?(ActiveRecord::Base)ActiveRecord::Base.extend Dragonfly::ModelActiveRecord::Base.extend Dragonfly::Model::Validations
end
rails generate model Photo
#app/models/photo.rbclass Photo < ActiveRecord::Basedragonfly_accessor :image
end
蜻蜓提供了一个需要添加到模型中的访问器。 这样您就可以读取和写入图像。
现在,导航到您的迁移文件并添加列。
#xxx_create_photos.rbclass CreatePhotos < ActiveRecord::Migrationdef changecreate_table :photos do |t|t.string :image_uidt.string :titlet.timestamps null: falseendend
end
注意:如果您使用的是avatar
而不是image
我上面的image
,则应将列更改为avatar_uid
。
迁移数据库:
rake db:migrate
使用必要的操作来设置PhotosController
,以上传图像。 它看起来应该像这样:
#app/controllers/photos_controller.rbclass PhotosController < ApplicationControllerdef index@photos = Photo.allenddef new@photo = Photo.newenddef create@photo = Photo.new(photo_params)if @photo.saveredirect_to photos_pathelserender :newendendprivatedef photo_paramsparams.require(:photo).permit(:image, :title)end
end
您将需要配置您的路线。
现在,将路由添加到您创建的三个操作中。
#config/routes.rbRails.application.routes.draw doresource :photos only: [:index, :new, :create]root to: "photos#index"
end
您需要像下面这样设置您的视图:
#app/views/photos/index.html.erb<h2>Photos</h2><p id="notice"><%= notice %></p><table><thead><tr><th>Title</th><th>Image</th><th colspan="3"></th></tr></thead><tbody><% @photos.each do |photo| %><tr><td><%= photo.title %></td><td><%= link_to image_tag(photo.image.thumb('100x100').url), photo.image.url %></td><td><%= link_to 'Show', photo %></td><td><%= link_to 'Edit', edit_photo_path(photo) %></td><td><%= link_to 'Destroy', photo, method: :delete, data: { confirm: 'Are you sure?' } %></td></tr><% end %></tbody>
</table>
#app/views/photos/new.html.erb<%= form_for @photo do |f| %><div><%= f.label :title %><%= f.text_field :title %></div><div><%= f.label :image %><%= f.file_field :image %></div><div><%= f.submit :submit %></div>
<% end %>
稍后我们将回到这些观点。
验证方式
为了安全起见,您不想授予用户上载任何类型文件的权限。 蜻蜓在初始化程序中为您提供了必要的方法。
#config/initializers/dragonfly.rb# Add model functionality
if defined?(ActiveRecord::Base)ActiveRecord::Base.extend Dragonfly::ModelActiveRecord::Base.extend Dragonfly::Model::Validations
end
现在,编辑您的照片模型,使其看起来像我下面的样子:
#app/models/photo.rbclass Photo < ActiveRecord::Basedragonfly_accessor :image#title validationvalidates_presence_of :title#image validationsvalidates_presence_of :imagevalidates_size_of :image, maximum: 400.kilobytes,message: "should not be more than 400KB", if: :image_changed?validates_property :format, of: :image, in: ['jpeg', 'png', 'gif'],message: "the formats allowed are: .jpeg, .png, .gif", if: :image_changed?
end
这是Dragonfly提供的验证的完整列表:
class Photoextend Dragonfly::Model::Validationsvalidates_presence_of :imagevalidates_size_of :image, maximum: 500.kilobytes# Check the file extensionvalidates_property :ext, of: :image, as: 'jpg'# ..or..validates_property :mime_type, of: :image, as: 'image/jpeg'# ..or actually analyse the format with imagemagick..validates_property :format, of: :image, in: ['jpeg', 'png', 'gif']validates_property :width, of: :image, in: (0..400), message: "é demais cara!"# ..or you might want to use image_changed? method..validates_property :format, of: :image, as: 'png', if: :image_changed?
end
您可以在Dragonfly文档中阅读有关它的更多信息。
您还应该考虑为用户提供编辑其保存图像的选项。 为此,我们需要在PhotosController
添加两个操作方法,并在视图中创建一个编辑页面。 您可能想要在执行删除操作时添加删除并显示操作,如下所示:
#app/controllers/photos_controller.rbclass PhotosController < ApplicationControllerbefore_action :set_photos, only: [:show, :edit, :update, :destroy]def index@photos = Photo.allenddef new@photo = Photo.newenddef create@photo = Photo.new(photo_params)if @photo.saveredirect_to @photoelserender :newendenddef showenddef editenddef updateif @photo.update(photo_params)redirect_to @photo, notice: "photo successfully updated"elserender :editendenddef destroy@photo.destroyredirect_to photos_url, notice: 'photo was successfully destroyed.'endprivatedef photo_paramsparams.require(:photo).permit(:image, :title)enddef set_photos@photo = Photo.find(params[:id])end
end
#app/views/photos/edit.html.erb<%= form_for @photo do |f| %><% if @photo.errors.any? %><div id="error_explanation"><h2><%= pluralize(@photo.errors.count, "error") %> prohibited this photo from being saved:</h2><ul><% @photo.errors.full_messages.each do |message| %><li><%= message %></li><% end %></ul></div><% end %><div><%= f.label :title %><%= f.text_field :title %></div><div><%= f.label :image %><%= f.file_field :image %></div><div><%= f.submit :submit %></div>
<% end %><%= link_to "Show", @photo %> |
<%= link_to "Back", photos_path %>
#app/views/photos/show.html.erb<div><strong>Title:</strong><%= @photo.title %>
</div>
<div><strong>Image:</strong><%= image_tag @photo.image.thumb('400x200#').url if @photo.image_stored? %>
</div><%= link_to 'Edit', edit_photo_path(@photo) %> |
<%= link_to 'Back', photos_path %>
如果尝试访问显示或编辑页面,将显示错误。 这是因为我们将路由限制为:new, :index, and :update
。 现在继续进行更改; 它应该看起来像这样:
#config/routes.rbRails.application.routes.draw doresources :photosroot to: "photos#index"
end
结论
此时,您现在可以将Dragonfly集成到Rails应用程序中。 如果您想尝试此处未提及的其他功能,请务必查看文档 。 我希望你喜欢它。
请记住,您始终可以在下面的表格中添加反馈,问题和评论。
翻译自: https://code.tutsplus.com/tutorials/rails-image-upload-using-dragonfly--cms-26179
使用Dragonfly上传Rails图片相关推荐
- java 上传的图片大小为0_JAVA技术:上传图片的缩放处理
图片上传到后,会根据情况将图片缩小成一个图标,我们可以利用java强大的图形处理功能,对上传的图片进行缩放处理. 下面的程序使用jdk1.4中最新的ImageIO对图片进行读写.使用AffineTra ...
- tinymce4.x 上传本地图片(自己写个插件)
tinymce是一款挺不错的html文本编辑器.但是添加图片是直接添加链接,不能直接选择本地图片. 下面我写了一个插件用于直接上传本地图片. 在tinymce的plugins目录下新建一个upload ...
- ECSHOP商品编辑器上传中文名图片产生乱码
2019独角兽企业重金招聘Python工程师标准>>> 在后台上传商品图片的时候,如果你选择一个中文名称的图片,那么上传后会产生乱码,导致图片显示不出来. 下面说一种解决办法: 使用 ...
- ckeditor 4.2.1_演示 ckeditor 上传插入图片
本文内容 FineUI ckeditor fckeditor/ckeditor 演示 ckeditor 4.2.1 上传&插入图片 最近看了一下 FineUI_v3.3.1 控件,对里边的 c ...
- 七牛云上传的图片进行删除
PHP方法: /*** 七牛云商品图片删除2017/10/25*/ public function delGoodsImg() {$this->isShopLogin();$img = I(&q ...
- win10打开程序响应很慢_小程序商城打开加载很慢?你上传的图片是不是太大了,压缩一下吧!...
原创:轻栈 今天分享一篇纯干货,看完能给小程序商城提速. 打开小程序商城,有时能看到加载条,先看到内容要等等. 等待是一件消磨耐心的事情,在这个浮躁的时代,愿意等的人真的少.所以,我们要找出导致小程序 ...
- php将上传的图片转为base64,html5实现把上传的图片转成base64编码在显示(代码实例)...
本章给大家介绍html5实现把上传的图片转成base64编码在显示(代码实例).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 首先我们来详细的看一看base64编码: 什么是bas ...
- ASP.NET MVC3 上传头像图片并截图
关于上传头像并且截图网上应该有很多资料,大多都是JQuery插件,用起来不是很方便 本文所介绍的方法将快速完成一个"上传头像图片并截图",只需要修改少量的代码 我们先来看看完成后的 ...
- Django搭建个人博客:上传头像图片
到目前为止我们的博客处理的都是文字.现代互联网早就进入了"读图"时代,图片的维护.展示也就相当重要. 上一章中预留了avatar字段,用来保存用户上传的头像,现在我们来实现这个功能 ...
- CSDN博文编辑技巧-如何去除上传的图片水印
在上传的图片链接中找到 /watermark,去除即可,注意把/斜杠也去掉 都看到这了,点个赞再走呗~~
最新文章
- Android OpenGL ES 入门系列(一) --- 了解OpenGL ES的前世今生
- python js加密解密_AES用cryptojs加密,用python解密加密Ciph
- ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
- mysql 忘记root密码 进行重置
- SpringBoot 配置Tomcat运行
- [Java基础]字符串中的编码解码问题
- 油田 (Oil Deposits UVA - 572)
- postman上传图片时已经添加cookie,但仍显示未登陆
- 使用哪种关机方式后再启动计算机时间最长,有没有哪一种软件可以使电脑在设置好时间后自动开关机...
- 设计模式-责任链模式(17)
- QT正则表达式截取字符串末尾数字
- 面试2年经验的Java程序员面试题部分带答案
- StretchDIBits函数
- 智能创新引导工具软件——工作量分配和里程碑安排
- 如何在Excel中创建组合图
- 计算机道德 英语作文,关于道德的英语作文
- ADO.NET 连接MySQL 8.0.23
- 微信小程序音频播放器(第二版)
- sqlitespy怎么打开.db数据库文件
- 在无聊的时候玩小游戏