2016-04-02 15 views
2

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!

Antwort

0

Der erste Ansatz sollte der gute sein. Die erstellte Zeichenfolge legt den MIME-Typ beim Start fest, und die Büroklammer kann die Base64-Zeichenfolge verarbeiten.

Beispiel in einem unserer Projekte (Arbeits gut)

#in our coffeescript (own ajax method, no jquery, but same behavior) 
ajax("images", 
    method: "post", 
    data: {image: @state.src} 
).then((result) => 
    console.log "yey" 
) 

#In the image_controller, to add an uploaded picture 
def create 
    current_user.photos.new picture: params[:image] 
end 

Unsere Büroklammer Version ist 4.3.3.Wir verwenden es mit der Html5-Datei-API, nicht mit Canvas, aber die Ausgabe (base64) ist genau dasselbe Format wie die Canvas#toDataUrl, solange wir eine Vorschau in einem src-Attribut eines Bildes anzeigen können.

+0

Danke Yacine, ich musste nur meinen Controller reparieren. – Horacio

+0

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

+0

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