- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如标题所述,我正在尝试使用 rails 的 Active Storage 从嵌套在 rails 表单中的元素将图像上传到我的 S3 存储桶。
到目前为止,我已经能够使用<%= f.input :signature, type: file_field(:user, :signature), %>
使用 Active Storage 上传图像。 User
类(class)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" %>
<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>
"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>"}
最佳答案
是的,这是可能的。
直接上传由 DirectUpload
处理类(或 ActiveStorage.DirectUpload
取决于您访问事物的方式)。通常 DirectUpload
想要一个 File
读取图像但足够方便, File
是 Blob
所以你几乎可以使用 Blob
反而。 Active Storage 只需要它的"file"中的一些东西,而且几乎所有这些东西都存在于 Blob
中。 ,唯一缺少的是一个 name
属性,您可以自己添加。
所以现在我们需要得到一个 Blob
出 Canvas 。这实际上很容易,因为 Canvas 有 toBlob
method :
The
HTMLCanvasElement.toBlob()
method creates aBlob
object representing the image contained in the canvas; this file may be cached on the disk or stored in memory at the discretion of the user agent.
const form = your_form_element;
const canvas = your_canvas_element;
const input = your_file_input;
canvas.toBlob(blob => {
// Fake out DirectUpload by manually adding a name.
blob.name = input.files[0].name;
const uploader = new DirectUpload(blob, input.dataset.directUploadUrl);
uploader.create((error, blob) => {
if(error) {
// Handle the error.
}
else {
// Add the <input type="hidden"> with the signature.
const hiddenField = document.createElement('input')
hiddenField.setAttribute('type', 'hidden');
hiddenField.setAttribute('value', blob.signed_id);
form.appendChild(hiddenField);
// And submit away...
form.submit();
}
});
}, 'image/jpeg', 0.95);
关于ruby-on-rails - 如何使用 rails 的 Active Storage 从 Rails 表单中的 <canvas/> 将图像上传到 S3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156108/
我是一名优秀的程序员,十分优秀!