Day 27 - 上传档案 Carrierwave - 多个档案

昨天说的是单一档案上传,如果要多个档案上传的话...

建立新栏位

资料表先新增可以储存一个阵列的栏位。这个资料型态可以是 Array 或者 JSON。
不过选择哪种资料型态会取决於你使用哪个资料库。因为有些资料不支援 JSON( 例:SQLite )
有支援 JSON 格式的资料库有 PostgreSQL、MySQL,建立专案时,已经设定过 database 为 PostgreSQL,所以这边就用 JSON 格式来设定栏位型态:

$ rails g migration add_avatars_to_profiles avatars:json
$ rails db:migrate

沿用 uploader,但 model 要正确挂载

因为这次要上传多个档案,所以用复数,mount_uploaders、:avatars 都要加上 s

# app/models/profile.rb
class User < ActiveRecord::Base
  mount_uploaders :avatars, AvatarUploader
end

controller 设定通关条件

# profiles_controller.rb

def profile_params
  params.require(:profile).permit(:nickname, :email, {avatars: []})
end

请注意,多个档案上传,储存的方式是阵列,所以在通过清洗的时候,要赋予一个空阵列的资料型态!
资料库的table储存的样子:["apple.png", "orange.png", "banana.jpg"]

views 表单改为多选

<%= form.file_field :avatars, multiple: true %>

这样就可以选取多个档案!

如果要在上传新档案时,保留目前现有档案的话,可以改成这段:


<% profile.avatars.each do |avatar| %>
  <%= hidden_field :profile, :avatars, multiple: true, value: avatar.identifier %>
<% end %>
<%= form.file_field :avatars, multiple: true %>

小补充:

profile.avatars[0].url
# 印出 '/url/to/file.jpg' 图片的相对路径

profile.avatars[0].current_path
# 印出 'path/to/file.jpg' 图片的绝对路径

profile.avatars[0].identifier
# 印出 'file.jpg' 图片的档名

profile.avatars[0].file.nil?
# 判断档案是否存在

限制档案类型

为了避免有心人士或使用者不小心上传错误的文件,造成危险,例如:php 档案或其他脚本文件。CarrierWave 可以让你指定允许的档案类型存取。
白名单写法,在名单中的才可以通过:

# avatar_uploader.rb

class AvatarUploader < CarrierWave::Uploader::Base
  def extension_whitelist
    %w(jpg jpeg gif png)
  end
end

黑名单写法,在名单中的会被拒绝存入:
假设我们拒绝 JSON 的档案

class NoJsonUploader < CarrierWave::Uploader::Base
  def content_type_blacklist
    ['application/text', 'application/json']
  end
end

参考资料:
GitHub - CarrierWave
PJCHENder未整理笔记

学无止尽,每天都要进步一点点!


<<:  DAY 29 第二十九章 风险类别-财务风险-感知层:8.4 实体攻击、8.5 维护设备成本、 8.6 设备失窃

>>:  Day-27 使用StatefulSet

Day03 - 纯 Html - 复杂型别 object

Day03 - 纯 Html 复杂型别 object 复杂型别定义 复杂型别我拆成三篇 object...

p value到底怎麽解释

在面试的时候很常都会从基础的问题开始问起,p值就像是你吃饱了吗一样每次都会出现,今天就来讲解一下这个...

【从零开始的 C 语言笔记】第三篇-基本的程序结构介绍 & 列印三角形

不怎麽重要的前言 上一篇我们学会怎麽创建档案,也运行了我们的第一个程序,接下来会介绍上次的程序码,分...

【Vue】将元件输出到画面|专案实作

输出完 header 元件後,试着在 App.vue 引入 TaiHeader.vue。 App.v...

Day8 - 如何读取委托回报、成交回报

你还在看,真有心,来吧! 我们一起牵手向前行! 读取委托回报,通常下单(raplace order)...