Ich suche nach einem einfachen Weg, um einen MIME-Typ zu erhalten, bei dem die Dateierweiterung falsch oder nicht angegeben ist, ähnlich wie bei dieser Frage nur in .Net.
c#
mime
mime-types
Richard Gourlay
quelle
quelle
Antworten:
In Urlmon.dll gibt es eine Funktion namens
FindMimeFromData
.Aus der Dokumentation
Lesen Sie also die ersten (bis zu) 256 Bytes aus der Datei und übergeben Sie sie an
FindMimeFromData
.quelle
Ich habe am Ende urlmon.dll verwendet. Ich dachte, es gäbe einen einfacheren Weg, aber das funktioniert. Ich füge den Code hinzu, um anderen zu helfen, und erlaube mir, ihn wieder zu finden, wenn ich ihn brauche.
...
quelle
Ich habe eine fest codierte Lösung gefunden. Ich hoffe, ich werde jemandem helfen:
quelle
StringComparer.OrdinalIgnoreCase
des Wörterbuchkonstruktors. Der ordinale Vergleich ist schneller als die Invariante, und Sie werden.ToLower()
seine Variationen los .Bearbeiten: Verwenden Sie einfach Mime Detective
Ich verwende Byte-Array-Sequenzen, um den richtigen MIME-Typ einer bestimmten Datei zu bestimmen. Dies hat gegenüber der Dateierweiterung des Dateinamens den Vorteil, dass die Dateinamenerweiterung dies nicht erfassen kann, wenn ein Benutzer eine Datei umbenennt, um bestimmte Einschränkungen beim Hochladen von Dateitypen zu umgehen. Auf der anderen Seite verhindert das Abrufen der Dateisignatur über ein Byte-Array, dass dieses schelmische Verhalten auftritt.
Hier ist ein Beispiel in C #:
Beachten Sie, dass ich DOCX-Dateitypen anders behandelt habe, da DOCX eigentlich nur eine ZIP-Datei ist. In diesem Szenario überprüfe ich einfach die Dateierweiterung, sobald ich überprüft habe, ob sie diese Reihenfolge hat. Dieses Beispiel ist für einige Leute bei weitem nicht vollständig, aber Sie können ganz einfach Ihr eigenes hinzufügen.
Wenn Sie mehr MIME - Typen hinzufügen möchten, können Sie die Byte - Array - Sequenzen von vielen verschiedenen Dateitypen von hier . Auch hier ist eine weitere gute Ressource in Bezug auf Dateisignaturen.
Wenn alles andere fehlschlägt, gehe ich häufig mehrere Dateien eines bestimmten Typs durch, nach denen ich suche, und suche nach einem Muster in der Byte-Sequenz der Dateien. Letztendlich ist dies immer noch eine grundlegende Überprüfung und kann nicht für einen 100% igen Nachweis der Bestimmung von Dateitypen verwendet werden.
quelle
Wenn Sie .NET Framework 4.5 oder höher verwenden, gibt es jetzt eine MimeMapping.GetMimeMapping-Methode (Dateiname), die eine Zeichenfolge mit der korrekten Mime-Zuordnung für den übergebenen Dateinamen zurückgibt. Beachten Sie, dass hierfür die Dateierweiterung und nicht die Daten in der Datei selbst verwendet werden.
Die Dokumentation finden Sie unter http://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping
quelle
var mimetype = System.Web.MimeMapping.GetMimeMapping(<pathToFile>);
Sie können auch in der Registrierung nachsehen.
Auf die eine oder andere Weise müssen Sie auf eine Datenbank mit MIMEs zugreifen - unabhängig davon, ob diese von Erweiterungen oder magischen Zahlen zugeordnet wurden, ist etwas trivial - die Windows-Registrierung ist ein solcher Ort. Für eine plattformunabhängige Lösung müsste man diese Datenbank jedoch mit dem Code (oder als eigenständige Bibliothek) ausliefern.
quelle
Ich benutze eine Hybridlösung:
quelle
.doc
Datei ist.HeyRed.Mime.MimeGuesser.GuessMimeType
von Nuget ist die ultimative Lösung, wenn Sie Ihre ASP.NET-Lösung in Nicht-Windows-Umgebungen hosten möchten.Die Dateierweiterungszuordnung ist sehr unsicher. Wenn ein Angreifer ungültige Erweiterungen hochladen würde, würde ein Zuordnungswörterbuch beispielsweise die Verteilung ausführbarer Dateien in JPG-Dateien ermöglichen. Verwenden Sie daher immer eine Content-Sniffing-Bibliothek, um den tatsächlichen Inhaltstyp zu ermitteln.
quelle
Ich denke, die richtige Antwort ist eine Kombination aus den Antworten von Steve Morgan und Serguei. So macht es der Internet Explorer. Der Pinvoke-Aufruf
FindMimeFromData
funktioniert nur für 26 fest codierte MIME -Typen. Außerdem werden mehrdeutige MIME-Typen (wietext/plain
oderapplication/octet-stream
) angegeben, obwohl möglicherweise ein spezifischerer, geeigneterer MIME-Typ vorhanden ist. Wenn kein guter MIME-Typ angegeben wird, können Sie in der Registrierung einen spezifischeren MIME-Typ suchen. Die Serverregistrierung verfügt möglicherweise über aktuellere MIME-Typen.Siehe: http://msdn.microsoft.com/en-us/library/ms775147(VS.85).aspx
quelle
Diese Klasse verwendet frühere Antworten, um drei verschiedene Versuche durchzuführen: Harcodiert basierend auf der Erweiterung, der FindMimeFromData-API und der Verwendung der Registrierung.
quelle
Ich fand das nützlich. Für VB.NET-Entwickler:
quelle
Ich bin auf dasselbe Problem gestoßen und habe mich schließlich für meinen eigenen Geschmack der Lösung von Kirk Baucom entschieden, die hier zu finden ist .
Es scheint mir, dass dies eine Gelegenheit für jemanden ist, einen Online-Suchdienst zu schreiben.
Wie auch immer, ich hoffe es hilft.
quelle
Wenn jemand dazu bereit wäre, könnte er das hervorragende Perl-Modul File :: Type nach .NET portieren . Im Code befindet sich eine Reihe von Suchvorgängen für magische Zahlen im Dateikopf für jeden Dateityp oder jede Regex-Übereinstimmung.
Hier ist eine Bibliothek zur Erkennung von .NET-Dateitypen http://filetypedetective.codeplex.com/ , die derzeit jedoch nur eine geringe Anzahl von Dateien erkennt.
quelle
Diese Antwort ist eine Kopie der Antwort des Autors (Richard Gourlay), wurde jedoch verbessert, um Probleme unter IIS 8 / win2012 zu lösen (bei denen die Funktion zum Absturz des App-Pools führen würde), basierend auf Rohlands Kommentar, der auf http://www.pinvoke.net verweist /default.aspx/urlmon.findmimefromdata
...
quelle
@Steve Morgan und @Richard Gourlay Dies ist eine großartige Lösung, danke dafür. Ein kleiner Nachteil ist, dass bei einer Anzahl von Bytes in einer Datei von 255 oder weniger der MIME-Typ manchmal "application / octet-stream" ergibt, was für Dateien, von denen erwartet wird, dass sie "text / plain" ergeben, etwas ungenau ist. Ich habe Ihre ursprüngliche Methode aktualisiert, um diese Situation wie folgt zu berücksichtigen:
Wenn die Anzahl der Bytes in der Datei kleiner oder gleich 255 ist und der abgeleitete MIME-Typ "application / octet-stream" ist, erstellen Sie ein neues Byte-Array, das aus den ursprünglichen Datei-Bytes besteht, die n-mal bis zur Gesamtzahl wiederholt werden Die Anzahl der Bytes ist> = 256. Überprüfen Sie dann den MIME-Typ in diesem neuen Byte-Array erneut.
Geänderte Methode:
quelle
IIS 7 oder mehr
Verwenden Sie diesen Code, aber Sie müssen der Administrator auf dem Server sein
quelle
Vergessen Sie bei der Arbeit mit der Windows Azure-Webrolle oder einem anderen Host, auf dem Ihre App in Limited Trust ausgeführt wird, nicht, dass Sie nicht auf die Registrierung oder den nicht verwalteten Code zugreifen dürfen. Hybrider Ansatz - Die Kombination aus Try-Catch-for-Registry und In-Memory-Wörterbuch scheint eine gute Lösung zu sein, die von allem etwas bietet.
Ich benutze diesen Code, um es zu tun:
quelle
Am Ende habe ich Winista MimeDetector von Netomatix verwendet. Die Quellen können kostenlos heruntergeladen werden, nachdem Sie ein Konto erstellt haben: http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx
Dies ist Teil einer anderen Frage, die hier beantwortet wurde: Alternative zur FindMimeFromData-Methode in Urlmon.dll, die mehr MIME-Typen enthält. Meiner Meinung nach die beste Lösung für dieses Problem.
quelle
Ich habe verschiedene Probleme beim Ausführen dieses Codes festgestellt:
Wenn Sie versuchen, es mit x64 / Win10 auszuführen, erhalten Sie
Dank dieses Beitrags funktioniert PtrToStringUni nicht in Windows 10 und @xanatos
Ich habe meine Lösung so geändert, dass sie unter x64 und .NET Core 2.1 ausgeführt werden kann:
Vielen Dank
quelle
Hallo, ich habe das Winista.MimeDetect-Projekt in .net Core / Framework mit Fallback in urlmon.dll angepasst. Es war frei, es zu verwenden: Nuget-Paket .
quelle
mimeTypes.GetMimeTypeFromFile(bytes);
Ich habe einen Validator vom Typ Mime geschrieben. Bitte teilen Sie es mit Ihnen.
quelle