Gefundene Bugs
FLV-Upload im Safari 3.1
Bei der Programmierung einer Ruby-on-Rails-Anwendung, bei der Nutzer die Möglichkeit haben sollen Dateien hochzuladen, fiel mir ein Fehler in Apples Safari 3.1 Browser auf, der interessanter Weise nur bei FLV-Dateien auftritt (Zumindest nicht bei der sonst ausprobierten: MP3, JPG, PNG, ICO oder DMG).
Nehmen wir im View ein einfaches Upload-Formular:
<% form_tag upload_url, :multipart => true do %>
<%= file_field('document', 'file') %>
<%= submit_tag('upload') %>
<% end %>
Die übergebene Datei wird dann im Controller einfach behandelt:
def upload @document = Document.new(params[:document]) if @document.save ... else ... end end
Im Model wird der Datensatz dann auf folgende Weise zugewiesen:
def file=(file) self.data = file.read self.name = base_part_of(file.original_filename) self.size = file.size self.content_type = file.content_type.chomp end private def base_part_of(file) File.basename(file).gsub(/[^\w._-]/, '') end
Dies funktioniert für viele Arten von Dateien ganz ausgezeichnet. Im Firefox sogar bei allen getesteten. Nur der Safari 3.1 ist der unbedingten Meinung, er müsse die Datei, wenn sie den ein FLV-Video ist, als String und nicht als 'multipart/form-data' versenden. Dadurch wirft natürlich gleich die erste Zeile im Model eine Exception.
Lösungsansätze?
- Keinen Apple Safari 3.1 Browser benutzen, falls man FLV-Dateien hochladen möchte…
- Datei vorher z.B. zu MP3 umbenennen und in der Anwendung wieder auf FLV setzen…
- Die Exception behandeln, indem man in diesem Fall einfach den String direkt einliest, auf den Dateinamen verzichtet und Content-Type und die Größe anders ermittelt…
Weitere Vorschläge nehme ich gerne entgegen.