Ich habe mit zwei Ansätze gearbeitet, aber das Ziel ist nur die Leinwand über Paperclip zu speichern.So speichern Sie ein Canvas über Büroklammer
Erster Ansatz
Leinwand zu Base64 und dann base64 hinzufügen mit Ajax
$(document).on('click', '#save_canvas', function() {
var base64Data = canvas.toDataURL()
$.ajax({
type: "POST",
url: "pictures/",
data: { base64: base64Data },
success: function(post){ console.log('success') },
error: function(post){ console.log(this) }
})
})
Zugang params params [: base64] vi ein Paperclip.adapters_io
def create
@picture = Picture.new(picture_params)
# ...
image = Paperclip.io_adapters.for(params[:base64])
image.original_filename = "canvas.png"
@picture.image = image
@picture.save
redirect_to @picture
end
ich denke, das nicht zu starten, funktioniert, weil dies nur base64
in params einschließlich und alle anderen erforderlichen params fehlt.
Zweiter Ansatz
Leinwand zu Base64 und dann manuell (nur, damit es funktioniert und hält von dort aus arbeitet) Kopieren von Daten von der Konsole aus und fügen Sie ihn in eine Form Feld.
= link_to " Base64", "#", remote: true, onclick: "console.log(canvas.toDataURL('png'))"
= form_for @picture, html: { multipart: true } do |form|
= form.text_field :base64
= form.submit
Zugang params [: Bild] [: base64] über Paperclip.adapters_io
def create
@picture = Picture.new(picture_params)
image = Paperclip.io_adapters.for(params[:picture][:base64])
image.original_filename = "canvas.png"
@picture.image = image
@picture.save
redirect_to @picture
end
Mit diesem Ansatz kann ich die Leinwand speichern. Aber ich habe zwei Probleme gefunden:
1) Ich muss den Kopier/Paste-Schritt beseitigen.
2) Canvas kann sehr lange Strings mit mehr als 1 Million Zeichen erzeugen (das ist verrückt) und das Formularfeld erlaubt keine so große Länge.
Dies ist ein Rails 4.2 Projekt 4.3 mit Büroklammer und wird auf Heroku gehostet werden.
Danke!
Danke Yacine, ich musste nur meinen Controller reparieren. – Horacio
Hallo Yacine, ich habe festgestellt, dass das Speichern von Bildern auf diese Weise sehr langsam ist, eine Art 5x - 6x langsamer. Ein Bild, das in einem 1000x1000px-Canvas gerendert wird, benötigt also ungefähr 16s bis 19s (localhost), um es zu speichern (so oft wie es ist, um das Bild zu kodieren). Hast du eine Idee, wie du das verbessern kannst? Vielen Dank! – Horacio
Ist es Server oder Client-Seite? Ich meine, es ist im toDataURL Teil? Wenn ja, habe ich leider keine Hinweise, um es zu beheben. Andernfalls, wenn es serverseitig ist, können Sie eine Umgehungsmöglichkeit schaffen, indem Sie mit der base64-Bibliothek eine temporäre Datei erstellen und diese temporäre Datei dann in eine Büroklammer kopieren. Viel Glück ! – Yacine