LoginSignup
6
2

More than 1 year has passed since last update.

【Rails】Carrierwaveを用いてAWSのS3にPDFのアップロードとダウンロードを可能にする。

Last updated at Posted at 2022-11-09

はじめに

PDF投稿機能。cloudinaryではpdfに対応していないので、AWSのS3を使ってPDF投稿を実現しました。

開発環境

  • Ruby 3.0.4
  • Rails 6.1.7

前提

  • tweetsコントローラーで投稿機能作成済み
  • tweetsテーブルにはpdfカラムstringで用意
  • AWSアカウント登録済

目次

  1. AWSの設定
  2. PDFをS3にアップロードできるようにする
  3. S3からPDFをダウンロードできるようにする
  4. 参考文献

AWSの設定

①IAMユーザーとS3バケットの作成

AWSを利用するための、IAMユーザーの作成と、S3バケットの作成はこちらの記事がわかりやすいので、参考にしてください。

S3を利用するにはIAMユーザーの作成が必要です。
IAMユーザーを作成した際のアクセスキーとシークレットアクセスキーが後に必要なので、.cnvファイルをダウンロードし、保管しておいてください。

②バケットポリシーの追加

上の記事の16.バケットの作成までできたら、バケットにポリシーを追加します。
①AWSの自分のアカウントにログインし、 S3>バケットを開く。
②自分のバケットの名前(リンクになっている部分)をクリック
アクセス許可を選択し、 バケットポリシーの編集をクリック
④以下のようにポリシーを変更し、保存

バケットポリシー
{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Principal": {
               "AWS": "*******************①**********************"
           },
           "Action": "s3:ListBucket",
           "Resource": "arn:aws:s3:::*******②*******"
       }
   ]
}

※①にはIAMのAWS、②にはS3のバケット名が入ります

IAMのAWSの確認は、 IAM>ユーザーへ行き、ユーザーの名(リンクになっている部分)をクリックすると確認できます。
例:arn:aws:iam::123456789123:user/hoge_user

PDFをS3にアップロードできるようにする

準備,Gemのインストール

Gemfile
gem 'dotenv-rails' 
gem 'fog-aws'
gem 'carrierwave'

コマンドプロンプト(ターミナル)で bundle installを実行

①キーを環境変数化

1,.envファイルの作成

.envというファイルを アプリケーションディレクトリ(appやdbやGemfileがあるディレクトリ) に自分で作成
②IAMユーザーを作成した際のアクセスキーとシークレットアクセスキーを参照し、以下を変更

.env
SECRET_ACCESS_KEY=p2g456789qwertyuiopasdfghjklzxcvbnm01234  #←自分のキーを入力
ACCESS_KEY_ID=ASDFGHJKL12ASDFGHJK  #←自分のキーを入力

2,.gitignoreの変更

gitignore
/.env

②Uploaderの作成と設定

1,uploaderの作成

コマンドプロンプト
$ rails generate uploader UploadPdf
$ rails generate model UploadPdf pdf:string

2,Tweetモデルにpdfカラムのuploaderを指定

mopdels/tweet.rb
class Tweet < ApplicationRecord
    mount_uploader :pdf, UploadPdfUploader
end

3,uploaderの変更

storage :fileをコメントアウトし、storage :fogのコメントアウトを外して有効にする

uploaders/upload_pdf_uploader.rb
  #storage :file
  storage :fog

②carrierwaveの作成と設定

1,initializersフォルダ内にcarrierwaveファイルの作成

コマンドプロンプト
$ type nul > config/initializers/carrierwave.rb

※Macではtouchで実行できる

2,carrierwaveファイルの変更

バケット名は自分のものに変更してください。

initializers/carrierwave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
    config.storage :fog
    config.fog_provider = 'fog/aws'
    config.fog_directory  = 'nacchi-test-aws' # バケット名
    config.fog_public = false
    config.fog_credentials = {
      provider: 'AWS',
      aws_access_key_id: ENV['ACCESS_KEY_ID'], # アクセスキー
      aws_secret_access_key: ENV['SECRET_ACCESS_KEY'], # シークレットアクセスキー
      region: 'ap-northeast-1', # リージョン
      path_style: true
    }
end

④PDFの表示(view)

tweets/index.html
  <% @tweets.each do |t| %>
    <div class="tweet">
      <%= t.id %>
      <%= t.body %>
      <%= t.pdf %>
      <object data=<%= t.pdf %> type="application/pdf" width="250" height="200"></object>
      <%= t.created_at %>
    </div>
  <% end %>

S3からPDFをダウンロードできるようにする

①ルーティングの設定

routes.rb
  get 'tweeets/download/:id',to: "tweets#download",as: "download_pdf"

①コントローラーの編集

tweets_controller.rb
  def download
    @tweet = Tweet.find(params[:id])
    send_data(@tweet.pdf.read,:filename => @tweet.pdf_identifier, :type => "application/pdf")
  end

①viewの編集

tweets/index.html.erb
  <% @tweets.each do |t| %>
    <div class="tweet">
    <%= t.id %>
    <%= t.body %>
      <%= t.pdf %>
     <object data=<%= t.pdf %> type="application/pdf" width="250" height="200"></object>
     <%= link_to 'ダウンロード',download_pdf_path(t.id) %> #追記
      <%= t.created_at %>
    </div>
  <% end %>

参考文献

最後に

初めてQiitaで記事を投稿しました。誤り、改良点がありましたら教えていただけると嬉しいです。

6
2
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
6
2