質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.21%

Rails AWS S3 iphoneでファイルをアップロードする際にpdfファイルが0Bになってしまう

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 407

lyzmfeqpxs54

score 214

いつもお世話になっております。
現在Ralisでwebページを作成しております。

AWS上でRails + Nginxでシステム運用しており、ファイルのアップロードはCarrierwave、アップロード先はAWSのS3を用いております。
データベースはRDSを使用しています。

以下のように、input fileに画像、動画、pdfをそれぞれ入力し、S3上にアップロードするというシンプルな仕組みを作っております。

アップロード後のS3の中を見てみると、画像、動画は問題なくアップロードされるのですが、「pdfファイルのみ」0Bとなり、ファイルも開けない状態となることがあります。

この現象は現状、確認している範囲では「iphoneのsafariブラウザのみ」で起こっております。

原因は分からないのですが、input fileでファイルを選択後一定時間(5分程度?)経った後にsubmitすると起こる可能性が高いように思えます。

input fileでファイルを選択後、時間をほとんど置かずにsubmitすれば起こりません。
windowsのchromeや、Macのsafariではこの現象は確認できませんでした。

どういった原因が考えられますでしょうか。
参考になるサイトでも構いませんので、適切な方法をご教示いただけますと幸いです。
よろしくお願いいたします。

環境
Amazon Linux release 2 (Karoo)
Rails 5.2.3
Ruby version: 2.6.1
RDS
ELB
S3

# show.html.erb
<%= form_with(model: @user_info, url: "/entry", local: true, html: {id: 'xx', class: 'yy'}) do |f| %>
 # 
  # 省略
  # 
  <%= f.file_field :movie, class: 'movie_file' %>
  <%= f.file_field :image, class: 'image_file' %>
  <%= f.file_field :pdf, class: 'pdf_file' %>
  # 
  # 省略
  # 
<% end %>
# model/user.rb
class User < ApplicationRecord

  mount_uploader :movie, ImageUploader
  mount_uploader :image, ImageUploader
  mount_uploader :pdf, ImageUploader

end
 # uploaders./mage_uploader.rb
 class ImageUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  include CarrierWave::MiniMagick

  # Choose what kind of storage to use for this uploader:
  # storage :file
  storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    # "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    "uploads"
  end

  # 画像の場合のみ処理
  process :fix_exif_rotation, if: :is_thumb?

  def fix_exif_rotation
    manipulate! do |img|
      img.auto_orient
      img = yield(img) if block_given?
      img
    end
  end

  def extension_whitelist
    %w(jpg jpeg png mp4 mov pdf)
  end

  def filename
    if original_filename.present?
       base = File.basename(original_filename, '.*')
       ext  = File.extname(original_filename).downcase
       base.gsub!(".","_")
     end
     # binding.pry
     if mounted_as == :logo
       type_name = 'logo'
     elsif mounted_as == :movie
       type_name = 'movie'
     elsif mounted_as == :company_profile
       type_name = 'pdf'
     end
     # binding.pry
    "#{model.id}_#{Time.zone.now.strftime('%Y%m%d')}_#{type_name}#{ext}" if original_filename.present?
  end

  def is_thumb? picture
    picture.content_type.include?("image/")
  end

end
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る