📜  Ruby on Rails文件上传(1)

📅  最后修改于: 2023-12-03 14:47:08.851000             🧑  作者: Mango

Ruby on Rails 文件上传

在 web 开发中,文件上传是一个非常常见的功能。Rails 提供了很多便捷的方法来完成文件上传。在此,我们将介绍 Rails 中的文件上传方法和流程,并提供相关的代码示例。

初始化

首先,我们需要在 Gemfile 中添加 carrierwavemini_magick 这两个 gem:

gem 'carrierwave'
gem 'mini_magick'

完成后,在终端中执行 bundle install 安装这两个 gem。

接下来,我们可以运行 rails generate uploader <name> 命令,其中 <name> 是你想要的上传文件的名称。例如:

rails generate uploader Avatar

这将自动创建一个名为 avatar_uploader.rb 的文件,在 app/uploaders 目录下。这个文件包含了 CarrierWave::Uploader 模块,它是一个用来上传文件的基础框架。

上传图片

我们以上传图片为例进行说明。

avatar_uploader.rb 文件中,你可以定义上传图片需要保存到的目录和生成的图片的版本。这里,我们使用 :file,将图片存储在本地文件系统中:

class AvatarUploader < CarrierWave::Uploader::Base
  storage :file
end

接下来,我们需要在 User 类中加入 mount_uploader :avatar, AvatarUploader 这个宏,来将 UserAvatarUploader 联系起来。这样,我们就可以在对 User 的操作中处理 Avatar 了。

User 类中添加以下代码:

class User < ApplicationRecord
  mount_uploader :avatar, AvatarUploader
end

如果你使用了已存在的模型数据,需要执行 rake carrierwave:reprocess CLASS=User VERSION=avatar 命令,以处理之前已有的数据并生成新的缩略图。如果是全新数据库,不需要这一步。

最后,在新建 User 表单中,我们需要添加一个文件域,来选择要上传的图片文件。可以使用 form_for 手写 HTML,也可以使用 Rails form helper。

HTML 方式:

<form action="/users" method="post" enctype="multipart/form-data">
  <label for="user_avatar">Avatar:</label>
  <input type="file" name="user[avatar]" id="user_avatar">
  <br>
  <input type="submit" value="Create User">
</form>

Rails form helper 方式:

<%= form_for @user, html: {multipart: true} do |f| %>
  <%= f.label :avatar %>
  <%= f.file_field :avatar %>
  <%= f.submit "Create User" %>
<% end %>
生成缩略图

通过使用 mini_magick gem,我们可以方便地为上传文件生成不同版本的缩略图。

avatar_uploader.rb 文件中,添加 include CarrierWave::MiniMagick 语句,引入 mini_magick

class AvatarUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  storage :file
end

接下来,我们可以使用 version 方法定义不同版本的缩略图。例如,我们想生成一个宽度为 100 像素,高度自适应的缩略图,可以这样定义:

class AvatarUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  storage :file

  version :thumb do
    process resize_to_fill: [100, nil]
  end
end

最后,在视图中,我们可以通过调用 user.avatar.url(:thumb) 来获取上传的图片的缩略图 URL。

至此,我们完成了一个简单的文件上传功能。

以上代码片段遵循 Markdown 格式。