📅  最后修改于: 2023-12-03 14:47:08.851000             🧑  作者: Mango
在 web 开发中,文件上传是一个非常常见的功能。Rails 提供了很多便捷的方法来完成文件上传。在此,我们将介绍 Rails 中的文件上传方法和流程,并提供相关的代码示例。
首先,我们需要在 Gemfile
中添加 carrierwave
和 mini_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
这个宏,来将 User
与 AvatarUploader
联系起来。这样,我们就可以在对 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 格式。