如标题中所述,我正在尝试使用 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>"}