【发布时间】:2023-03-27 10:28:02
【问题描述】:
如标题中所述,我正在尝试使用 Rails 的 Active Storage 从嵌套在 rails 表单中的元素将图像上传到我的 S3 存储桶。
到目前为止,我已经能够使用
<%= f.input :signature, type: file_field(:user, :signature), %>
使用 Active Storage 上传图像。 User 类 has_one_attached :signature。当我使用 file_field 时,图像会正确上传,所以这不是问题的一部分。
到目前为止,我的simple_form 有:
<div class="signature_pad text-center form-group">
<div class="signature_pad_heading">
Enter your Signature:
</div>
<div class="signature_pad_body">
<canvas id="signature_pad_input" height="145px" width="370px" style="height: 145px; width: 370px;" class="border" />
</div>
<div class="signature_pad_footer">
<button type="button" class="btn btn-default" onclick="signaturePad.clear()">Clear</button>
</div>
</div>
<%= f.input :signature, type: file_field(:user, :signature), value: "", as: :hidden %>
<%= f.submit "Save", class:'btn-primary btn-lg btn-md-wide', id: "signature_pad_save" %>
我的 javascript 是:
<script src="https://cdn.jsdelivr.net/npm/signature_pad@2.3.2/dist/signature_pad.min.js"></script>
<script>
const canvas = document.querySelector("canvas");
const signaturePad = new SignaturePad(canvas);
$('#signature_pad_save').click(function(event) {
if (signaturePad.isEmpty()){
alert('Please enter your signature.');
event.preventDefault();
} else {
$('#user_signature').val(
JSON.parse(
signaturePad.toDataURL()
);
}});
</script>
使用 .toDataURL 我能够获取图像的 base64,我所阅读的所有内容似乎都指出这就是我需要通过 Active-Storage 发送到 S3 的全部内容。
最后:
使用 .file_field 时发送的内容
"signature"=>"<ActionDispatch::Http::UploadedFile:0x007f7a02ad4ef8 @tempfile=#<Tempfile:/tmp/RackMultipart20180903-3527-kked3g.png>, @original_filename="signature1.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"user[signature]\"; filename=\"signature1.png\"\r\nContent-Type: image/png\r\n">},"
当我尝试在表单提交之前插入值时发送的内容
"signature"=>"#<ActiveStorage::Attached::One:0x007f7a01c8b4f0>"}
【问题讨论】:
-
看起来好像 ActiveStorage 本身不支持它。 https://stackoverflow.com/questions/50140171/activestorage-to-upload-large-base64-encoded-string
标签: ruby-on-rails canvas amazon-s3 rails-activestorage signaturepad