Dienstag, Dezember 10, 2019

Ruby on Rails: Wie wollen Sie überprüfen, ob eine Datei ein Bild ist?

Wie würden Sie überprüfen, ob eine Datei ein Bild ist? Ich denke man könnte eine Methode wie folgt:

def image?(file)
  file.to_s.include?(".gif") or file.to_s.include?(".png") or file.to_s.include?(".jpg")
end

Aber das wäre ein wenig ineffizient und nicht korrekt. Irgendwelche Ideen?

(Ich bin mit der Büroklammer plugin, btw, aber ich sehe keine Methoden, um zu bestimmen, ob eine Datei ein Bild in Büroklammer)

InformationsquelleAutor sjsc | 2010-02-08

6 Kommentare

  1. 15

    Ich würde das ruby-filemagic Juwel, das ist ein Ruby-binding für libmagic.

    • Danke Sinan für den tollen link! Ich wusste nicht, dass Sie existiert. Danke.
    • Der file-Befehl ist wirklich ideal für diese, so diese wrapper sollte den job tun.
  2. 12

    Ein Ansatz ist es, die „Magische Zahl“ Konvention zum Lesen des ersten bits einer Datei.


    http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html

    Beispiele:

     "BM" ist ein Bitmap-Bild 
    "GIF8" ist ein GIF-Bild 
    "\xff\xd8\xff\xe0" ist ein JPEG-Bild 
    

    Beispiel in Ruby:

     def bitmap?(Daten) 
    return data[0,2]=="MB" 
    Ende 
    
    def gif?(Daten) 
    return data[0,4]=="GIF8" 
    Ende 
    
    def jpeg?(Daten) 
    return data[0,4]=="\xff\xd8\xff\xe0" 
    Ende 
    
    def file_is_image?(mit dem Namen) 
    f = File.open(Dateiname,'rb') # rb bedeutet Lesen mit binären 
    Daten = f.Lesen(9) # magic-Nummern bis zu 9 bytes 
    f.in der Nähe 
    return bitmap?(Daten) oder gif?(Daten) oder jpeg?(Daten) 
    Ende 
    
    

    Warum verwenden Sie diese anstelle der Datei-Namen-Erweiterung oder die filemagic Modul?

    Zu erkennen, die Daten geben, bevor das schreiben von Daten auf die Festplatte. Zum Beispiel können wir Lesen-upload-Datenstrom, bevor wir schreiben alle Daten auf der Festplatte. Wenn die magic number nicht mit dem web-Formular-Inhalten geben, dann können wir sofort einen Fehler melden.

    Setzen wir real-world-code etwas anders. Wir erstellen einen hash: jede Taste ist eine Magische Zahl string, jeder Wert ist ein symbol wie :bitmap, gif, jpeg, etc. Wenn jemand möchte, um zu sehen, real-world-code, fühlen Sie sich frei, mich hier zu Kontaktieren.

    • Ein weiterer Ansatz bei der überprüfung jpeg? wäre return data[0,3].bytes == [255, 216, 255]
  3. 11

    Bitte überprüfen Sie es einmal

    MIME::Types.type_for('tmp/img1.jpg').first.try(:media_type)
    => "image"
    
    MIME::Types.type_for('tmp/img1.jpeg').first.try(:media_type)
    => "image"
    
    MIME::Types.type_for('tmp/img1.gif').first.try(:media_type)
    => "image"
    
    MIME::Types.type_for('tmp/ima1.png').first.try(:media_type)
    => "image"
    • Ich weiß nicht, warum du downvoted, aber das funktioniert absolut gut in Rails 5.0 ! Danke.
    • funktioniert Super mit Rails 4.2.x.x auch
  4. 7

    Da bist du mit einer Büroklammer, Sie können mit dem eingebauten „validates_attachment_content_type“ – Methode in das Modell, wo „has_attached_file“ verwendet wird, und angeben, welche Dateitypen Sie zulassen möchten.

    Hier ist ein Beispiel aus einer Anwendung, bei der Benutzer einen avatar hochladen, der für Ihr Profil:

    has_attached_file :avatar, 
                      :styles => { :thumb => "48x48#" },
                      :default_url => "/images/avatars/missing_avatar.png",
                      :default_style => :thumb
    
    validates_attachment_content_type :avatar, :content_type => ["image/jpeg", "image/pjpeg", "image/png", "image/x-png", "image/gif"]

    Die Dokumentation ist hier http://dev.thoughtbot.com/paperclip/classes/Paperclip/ClassMethods.html

    • Danke Beerlington!
  5. 1

    imagemagick hat einen Befehl namens Identität, behandelt diese – überprüfen Sie w/die Büroklammer-Dokumentation – es ist wahrscheinlich eine Art das zu handhaben, aus Ihrem RoR app.

    • Danke für den Tipp Claude und John auf die Identität. Das werde ich mal überprüfen. Vielen Dank für die Empfehlung.
  6. 0

    Als Ergänzung zu Joels Antwort, in Schienen 5 hatte ich zum transformieren der Vergleich-string in einen bytecode.
    Eg:

    def jpeg?(data)
      return data[0,4]=="\xff\xd8\xff\xe0".b
    end

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...