0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】carrierwaveでファイルをアップロードする時に、元々のファイル名(オリジナル名)をカラムに保存されるようにする

Last updated at Posted at 2024-01-26

はじめに

carrierwaveで投稿に添付ファイルをアップロードする機能を作成しました。
その機能では、ローカル環境に保存するためセキュリティの問題でファイルを保存するときにランダムなファイル名に変更されるようにしております。
しかし、画面にファイル名を表示する時は元々のオリジナルのファイル名を表示する必要がでてきたので、今回はこの問題を対応した。
carrierwaveでのファイルの投稿機能自体については省略します。

環境

ruby 3.1.2p20
Rails 7.0.4

変更前のテーブル

Posts
title
text
attachment_file

実際に対応したこと

Postsテーブルにoriginal_file_nameカラムを追加して、attachment_fileを保存する前ににファイルのオリジナルのファイル名をoriginal_file_nameに保存する処理を追加しました。

original_file_nameカラムを追加します

db/migrate/20240101XXXXXX_add_column_posts.rb
class AddOriginalFileNameToPosts < ActiveRecord::Migration[7.0]
  def up
    add_column :posts, :original_file_name, :string
  end
  def down
    remove_column :posts, :original_file_name
  end
end

$ railis db:migrate

変更後のテーブル構造

Posts
title
text
attachment_file
original_file_name

オリジナルのファイル名を保存するメソッドをuploader.rbに作成します。

app/uploaders/post_detail_file_uploader.rb
# 元々のファイル名をsetする
def set_original_file_name
model.original_file_name = file.original_filename if file.present?
end

file.original_filenameでファイル名を取得できます。
それで取得したファイル名を
model.original_file_nameに代入するだけの凄くシンプルなコード

作成したメソッドをbefore_saveを使用してpost.rbでモデルが保存される前に実行するように設定します。

app/models/post.rb
before_save :set_original_file_name

def set_original_file_name
  detail_file.set_original_file_name if detail_file.present?
end

これで元々のファイル名をカラムに保存できるので、元々のファイル名で扱いたい時はこのカラムを呼び出すことで対応できるようになりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?