如果我在客户端上使用JavaScript编辑/生成图像(例如,裁剪的照片或画布图的结果),是否可以使用ActiveStorage上传它?
它通常是一个包含"<img src='data:image/jpeg;base64,...=='>"
的大字符串,存储在JavaScript变量中,而不是文件中。
答案 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)
我喜欢这个。
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