はじめに
PDF投稿機能。cloudinaryではpdfに対応していないので、AWSのS3を使ってPDF投稿を実現しました。
開発環境
- Ruby 3.0.4
- Rails 6.1.7
前提
- tweetsコントローラーで投稿機能作成済み
- tweetsテーブルにはpdfカラムstringで用意
- AWSアカウント登録済
目次
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のインストール
gem 'dotenv-rails'
gem 'fog-aws'
gem 'carrierwave'
コマンドプロンプト(ターミナル)で bundle install
を実行
①キーを環境変数化
1,.env
ファイルの作成
①.env
というファイルを アプリケーションディレクトリ(appやdbやGemfileがあるディレクトリ) に自分で作成
②IAMユーザーを作成した際のアクセスキーとシークレットアクセスキーを参照し、以下を変更
SECRET_ACCESS_KEY=p2g456789qwertyuiopasdfghjklzxcvbnm01234 #←自分のキーを入力
ACCESS_KEY_ID=ASDFGHJKL12ASDFGHJK #←自分のキーを入力
2,.gitignore
の変更
/.env
②Uploaderの作成と設定
1,uploaderの作成
$ rails generate uploader UploadPdf
$ rails generate model UploadPdf pdf:string
2,Tweetモデルにpdfカラムのuploaderを指定
class Tweet < ApplicationRecord
mount_uploader :pdf, UploadPdfUploader
end
3,uploaderの変更
storage :fileをコメントアウトし、storage :fogのコメントアウトを外して有効にする
#storage :file
storage :fog
②carrierwaveの作成と設定
1,initializersフォルダ内にcarrierwaveファイルの作成
$ type nul > config/initializers/carrierwave.rb
※Macではtouchで実行できる
2,carrierwaveファイルの変更
バケット名は自分のものに変更してください。
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.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をダウンロードできるようにする
①ルーティングの設定
get 'tweeets/download/:id',to: "tweets#download",as: "download_pdf"
①コントローラーの編集
def download
@tweet = Tweet.find(params[:id])
send_data(@tweet.pdf.read,:filename => @tweet.pdf_identifier, :type => "application/pdf")
end
①viewの編集
<% @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で記事を投稿しました。誤り、改良点がありましたら教えていただけると嬉しいです。