Base64 でエンコードされた画像をペーパークリップでアップロード - Rails

概要

Cropit を使用して、params を介してレール上で bas64 エンコードされた画像を取得します。

  image = params['image'].gsub('data:image/jpeg;base64,', '')
  decoded_file = Base64.decode64(image)

それからペーパークリップを使ってAmazon s3に保存します

   begin
    file = Tempfile.new(['image', '.jpg'])
    file.binmode
    file.write decoded_file
    unless params['image_id']
      media_img = Media::Image.new()
      media_img.image = file
      if media_img.save
        render json: {status: 'success'}
      else
        render json: {status: 'error'}
      end
    else
      img = Media::Image.find(params['image_id'])
      img.update_attribute(:image, file)
      img.update_attribute(:name, params['image_name'])
      render json: {status: 'success'}
    end
    file.close
  ensure
    file.unlink
  end

主な問題は、gsub を data:image/jpeg;base64 に対してのみ使用し、Tempfile を作成するときに jpg Tempfile.new([‘image’, ‘.jpg’]) を作成したため、コードが jpeg 画像に対してのみ機能することです。 。では、ベスト プラクティスの jpg、jpeg、png をどのように処理すればよいでしょうか?

解決策

これは私の解決策であり、Paperclip.io_adapters.for(image) を使用します。ここで、画像はbase64文字列です。

def create_image image, image_name, cat
  signature = Paperclip.io_adapters.for(image)
  base_name = File.basename(image_name,File.extname(image_name))
  signature.original_filename = "#{base_name}.jpg"
  media_img = Media::Image.new()
  media_img.image = signature
  media_img.company_id = current_company_id
  media_img.type = cat
  media_img.save
end