文件上传是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图片相关推荐

  1. java 上传的图片大小为0_JAVA技术:上传图片的缩放处理

    图片上传到后,会根据情况将图片缩小成一个图标,我们可以利用java强大的图形处理功能,对上传的图片进行缩放处理. 下面的程序使用jdk1.4中最新的ImageIO对图片进行读写.使用AffineTra ...

  2. tinymce4.x 上传本地图片(自己写个插件)

    tinymce是一款挺不错的html文本编辑器.但是添加图片是直接添加链接,不能直接选择本地图片. 下面我写了一个插件用于直接上传本地图片. 在tinymce的plugins目录下新建一个upload ...

  3. ECSHOP商品编辑器上传中文名图片产生乱码

    2019独角兽企业重金招聘Python工程师标准>>> 在后台上传商品图片的时候,如果你选择一个中文名称的图片,那么上传后会产生乱码,导致图片显示不出来. 下面说一种解决办法: 使用 ...

  4. ckeditor 4.2.1_演示 ckeditor 上传插入图片

    本文内容 FineUI ckeditor fckeditor/ckeditor 演示 ckeditor 4.2.1 上传&插入图片 最近看了一下 FineUI_v3.3.1 控件,对里边的 c ...

  5. 七牛云上传的图片进行删除

    PHP方法: /*** 七牛云商品图片删除2017/10/25*/ public function delGoodsImg() {$this->isShopLogin();$img = I(&q ...

  6. win10打开程序响应很慢_小程序商城打开加载很慢?你上传的图片是不是太大了,压缩一下吧!...

    原创:轻栈 今天分享一篇纯干货,看完能给小程序商城提速. 打开小程序商城,有时能看到加载条,先看到内容要等等. 等待是一件消磨耐心的事情,在这个浮躁的时代,愿意等的人真的少.所以,我们要找出导致小程序 ...

  7. php将上传的图片转为base64,html5实现把上传的图片转成base64编码在显示(代码实例)...

    本章给大家介绍html5实现把上传的图片转成base64编码在显示(代码实例).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 首先我们来详细的看一看base64编码: 什么是bas ...

  8. ASP.NET MVC3 上传头像图片并截图

    关于上传头像并且截图网上应该有很多资料,大多都是JQuery插件,用起来不是很方便 本文所介绍的方法将快速完成一个"上传头像图片并截图",只需要修改少量的代码 我们先来看看完成后的 ...

  9. Django搭建个人博客:上传头像图片

    到目前为止我们的博客处理的都是文字.现代互联网早就进入了"读图"时代,图片的维护.展示也就相当重要. 上一章中预留了avatar字段,用来保存用户上传的头像,现在我们来实现这个功能 ...

  10. CSDN博文编辑技巧-如何去除上传的图片水印

    在上传的图片链接中找到 /watermark,去除即可,注意把/斜杠也去掉 都看到这了,点个赞再走呗~~

最新文章

  1. Android OpenGL ES 入门系列(一) --- 了解OpenGL ES的前世今生
  2. python js加密解密_AES用cryptojs加密,用python解密加密Ciph
  3. ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
  4. mysql 忘记root密码 进行重置
  5. SpringBoot 配置Tomcat运行
  6. [Java基础]字符串中的编码解码问题
  7. 油田 (Oil Deposits UVA - 572)
  8. postman上传图片时已经添加cookie,但仍显示未登陆
  9. 使用哪种关机方式后再启动计算机时间最长,有没有哪一种软件可以使电脑在设置好时间后自动开关机...
  10. 设计模式-责任链模式(17)
  11. QT正则表达式截取字符串末尾数字
  12. 面试2年经验的Java程序员面试题部分带答案
  13. StretchDIBits函数
  14. 智能创新引导工具软件——工作量分配和里程碑安排
  15. 如何在Excel中创建组合图
  16. 计算机道德 英语作文,关于道德的英语作文
  17. ADO.NET 连接MySQL 8.0.23
  18. 微信小程序音频播放器(第二版)
  19. sqlitespy怎么打开.db数据库文件
  20. 在无聊的时候玩小游戏

热门文章

  1. 树莓派实现实时视频监控
  2. JAVA怎么开发一个胖客户端_胖客户端瘦客户端哑终端
  3. NX/UG二次开发—CAM—快速查找程序参数名称
  4. pe和linux一起安装到移动硬盘,能否把winpe安装到移动硬盘上
  5. JAVA生成带LOGO的二维码
  6. 第二十八篇 -- 学习第五十一天打卡20190819
  7. JUC种常用的辅助类
  8. 百度网盘机器人好友群组消息虚拟商品自动发货回复软件机器人助手
  9. Oracle的SQL注入
  10. NOD32升级ID获取器For流星无语