ActiveStorage上传大型base64编码的字符串?

时间:2018-05-02 17:14:53

标签: ruby-on-rails rails-activestorage

如果我在客户端上使用JavaScript编辑/生成图像(例如,裁剪的照片或画布图的结果),是否可以使用ActiveStorage上传它?

它通常是一个包含"<img src='data:image/jpeg;base64,...=='>"的大字符串,存储在JavaScript变量中,而不是文件中。

4 个答案:

答案 0 :(得分:0)

据我所知,Active Storage目前没有原生支持。

也许this Rails issue有更多有用的信息。

我们已经使用Shrine(及其DataURI Plugin)实现了数据URI上传,并且在我们迁移之前,我们正在等待有正确的方法与Active Storage一起执行此操作。

答案 1 :(得分:0)

您可以执行以下操作:

decoded_data = Base64.decode64(params[:base64].split(',')[1])
resource.image = { 
  io: StringIO.new(decoded_data),
  content_type: 'image/jpeg',
  filename: 'image.jpg'
}

答案 2 :(得分:0)

有一个瑰宝。

看看https://github.com/rootstrap/active-storage-base64

安装gem后,这非常简单。

.custom-parent > .custom-child{
     color:green !important;
}

<div class="custom-parent">
   <p class="custom-child">some text</p>
   <a href="#" class="custom-child">some text</a>
   <spam class="custom-child">some text</span>
</div>

通过以下方式分配模型实例:

class User < ActiveRecord::Base
  include ActiveStorageSupport::SupportForBase64
end


class User < ApplicationRecord
  has_one_base64_attached :avatar
end

答案 3 :(得分:0)

除了Diego Carrionanswer

我喜欢这个。

class Booking < ApplicationRecord
  ...
  has_one_attached :signature
  ...


module Api
  module V1
    class BookingsController < Api::V1::ApiController
    ...
    
      def confirm_hire_details
        booking = current_user.bookings.find(params[:id])

        if booking.update(booking_params.merge(
          {
            signature: signature_decoded
          }
        ))
          ...
        else
          ...
        end
      end

      private

      def signature_decoded
        decoded_data = Base64.decode64(params[:signature].split(',')[1])
        {
          io:           StringIO.new(decoded_data),
          content_type: 'image/jpeg',
          filename:     "signature-#{Time.current.to_i}.jpg"
        }
      end