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?

More than 3 years have passed since last update.

【Ruby on Rails】gemを使わずにアップロードされた画像を保存する方法(初学者向け)

Last updated at Posted at 2021-02-02

プログラミングの学習を初めてこのかた、今までrefileを使用した画像の投稿の仕方のみを実装してきたため、gemを使用しない画像ファイルの保存方法を知らずに来てしまった。
が、先日Railsのデフォルトの機能のみで画像ファイルを保存する方法を学んだので、備忘録として記載しておこうと思う。

ちなみにテーブルのカラムは以下の通り
postsテーブル
・title
・content
・image_name

1.publicフォルダ内に画像ファイルを格納するフォルダを作成

アップロードされた画像ファイルを格納するpost_imagesフォルダpublicフォルダ階層下に作成する。
スクリーンショット 2021-02-02 15.54.55.png
アップロードされた画像ファイルはこのフォルダの中に"id.jpg"という名前で保管されることとなる。
一覧画面や詳細画面で画像を表示する際は、"id.jpg"の中身の記述を参照し、画像として読み込んで処理をする流れとなる。

つまり、データベースのカラムに保存されるのはあくまで"id.jpg"という画像ファイルを示す名前であって、実際のファイルはこのpublic内に用意した場所で保管する必要がある。

2.controllerに処理を記述する

今回はparamsの中身が分かりやすいように、あえてストロングパラメータを使用しない書き方で説明していく。

app/controllers/posts_controller.rb
:
  def create
    @post = Post.new
    @post.title = params[:title]
    @post.content = params[:content]
    # image_nameカラムにid.jpgという値を代入  
    @post.image_name = "#{@post.id}.jpg"
    # 変数imageにフォームから送信された値を代入
    image = params[:image]
    # File.binwriteで、public/post_imagesにファイルを作成
    File.binwrite( "public/post_images/#{@post.image_name}", image.read )
    @post.save
  end
:

上記の処理内容を詳しく見ていく

1.image_nameカラムにid.jpgという値を代入

@post.image_name = "#{@post.id}.jpg"

この名前でファイルを作成する為、アップロードされた画像はjpg形式に変換されて保存される。

2.変数imageにアップロードされた画像ファイルを代入

image = params[:image]

ここで変数imageにフォームから送られてきた画像ファイルの中身を代入する。

3.public/post_imagesにファイルを作成

その前に軽く説明しておくと、Railsにはデフォルトで用意されているFileクラスというものが存在し、このクラスにwriteメソッドを使用することで、引数で指定した場所に、指定した記述内容のファイルを作成することができる。


# 基本形
File.write(ファイルの場所, ファイルの中身)

# 使用例
File.write("public/hello.text", "Hello")

public/hoge.text
Hello

これを踏まえた上で以下の行の流れを解説すると以下の通りになる

File.binwrite("public/post_images/#{@post.image_name}", image.read)
               #第一引数                    #第二引数

Fileクラスに対し、binwriteメソッドを使用(画像ファイルの場合はwriteではなくbinwriteでファイルを作成)
・第一引数で格納先に先ほど用意したpost_imagesフォルダを指定
・第二引数として渡す内容を読み込む為に、変数imagereadメソッドを使用して、変数の中身を参照

感想

結論から言ってこちらの方法に関してはあくまで流れを理解するという名目に留めておき、実際はgemを使うのが一番手取り早いように感じる。

記載内容に間違いがあった場合はご指摘頂けると嬉しいです。
ご連絡お待ちしております。

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?