2017-07-04 3 views
0

Ich erstelle einen Rails-Endpunkt, der einen anderen Dienst verwendet und die Antworten dieses Dienstes abbildet. Das Hauptproblem besteht darin, die Bytedaten eines Dateianhangs an diesen Dienst weiterzuleiten.Verwenden Sie PaperClip-Validierungen, ohne den Anhang zu speichern

Eine Einschränkung besteht darin, dass ich die Datei überprüfen muss, bevor ich sie übergebe.

Ich muss nicht die Datei in meiner Rails App beibehalten, es wird nur als Eingabe für den anderen Dienst verwendet.

In einer sehr einfachen Implementierung lese ich einfach nur die Bytes aus dem entsprechenden Anfrage-Parameter, der in einer Tempfile verpackt ist, aber das beinhaltet natürlich keine Plausibilitätsprüfungen und ist daher nicht gut genug.

Ich interessiere mich für die Art der Validierung, die Paperclip unterstützt, insbesondere Größe und Inhaltstyp, aber ich würde es vorziehen, die eigentliche Datei nirgendwo zu speichern.

Ist es möglich, nur die Validierungsteile von Paperclip zu verwenden und den Aufsatz nicht irgendwo aufzubewahren?

Antwort

1

Sie können die Datei MIME-Typ mit dem Edelstein ruby-filemagic überprüfen:

FileMagic.new(FileMagic::MAGIC_MIME).file(your_tempfile.path) #=> "image/png; charset=binary" 

Für die Größe, die Sie konnte einfach überprüfen mit your_tempfile.size

+0

Vielen Dank für Ihre Antwort. Ich kam mit einem etwas anderen Ansatz, wie in separaten Antwort hier, aber da ich nie angegeben, dass ich nur auf Büroklammer verlassen wollte, akzeptiere ich dies als die richtige Antwort. –

1

Dies ist, wie ich es am Ende zu lösen, stark von https://gist.github.com/basgys/5712426 inspiriert

Da mein Projekt bereits Büroklammer verwendete, entschied ich mich für eine Lösung auf dieser Grundlage, anstatt mehr Edelsteine ​​einzubeziehen.

Zunächst wird ein nicht-persistentes Modell wie folgt:

class Thumbnail 
    extend ActiveModel::Callbacks 
    include ActiveModel::Model 
    include Paperclip::Glue 

    ALLOWED_SIZE_RANGE = 1..1500.kilobytes.freeze 
    ALLOWED_CONTENT = ['image/jpeg'].freeze 

    # Paperclip required callbacks 
    define_model_callbacks :save, only: [:after] 
    define_model_callbacks :destroy, only: %i(before after) 

    attr_accessor :image_file_name, 
       :image_content_type, 
       :image_file_size, 
       :image_updated_at, 
       :id 

    has_attached_file :image 
    validates_attachment :image, 
         presence: true, 
         content_type: { content_type: ALLOWED_CONTENT }, 
         size: { in: ALLOWED_SIZE_RANGE } 

    def errors 
    @errors ||= ActiveModel::Errors.new(self) 
    end 
end 

Dann wickeln Sie die eingehende Bilddatei in diesem Modell von der Steuerung:

class SomeController < ApplicationController 
    before_action :validate_thumbnail 

    def some_action 
    some_service.send(image_data) 
    end 


    private 

    def thumbnail 
    @thumbnail ||= Thumbnail.new(image: params.require(:image)) 
    end  

    def validate_thumbnail 
    render_errors model: thumbnail if thumbnail.invalid? 
    end 

    def image_data 
    Paperclip.io_adapters.for(thumbnail.image).read 
    end 

    def some_service 
    # memoized service instance here 
    end 
end 
Verwandte Themen