go get github.com/gabriel-vasile/mimetype
mtype := mimetype . Detect ([] byte )
// OR
mtype , err := mimetype . DetectReader ( io . Reader )
// OR
mtype , err := mimetype . DetectFile ( "/path/to/file" )
fmt . Println ( mtype . String (), mtype . Extension ())
راجع أمثلة Go Playground القابلة للتشغيل.
استخدم المكتبات مثل mimetype فقط كملاذ أخير. يعد اكتشاف نوع المحتوى باستخدام الأرقام السحرية بطيئًا وغير دقيق وغير قياسي. في معظم الأوقات، تحتوي البروتوكولات على طرق لتحديد مثل هذه البيانات الوصفية؛ على سبيل المثال، رأس Content-Type
في HTTP وSMTP.
س: ملفي موجود في قائمة أنواع MIME المدعومة ولكن لم يتم اكتشافه بشكل صحيح. ماذا علي أن أفعل؟
ج: تحتفظ بعض تنسيقات الملفات (غالبًا مستندات Microsoft Office) بتوقيعاتها في نهاية الملف. حاول زيادة عدد البايتات المستخدمة للكشف باستخدام:
mimetype . SetLimit ( 1024 * 1024 ) // Set limit to 1MB.
// or
mimetype . SetLimit ( 0 ) // No limit, whole file content used.
mimetype . DetectFile ( "file.doc" )
إذا لم تساعد زيادة الحد، يرجى فتح مشكلة.
يستخدم mimetype بنية هرمية للحفاظ على منطق الكشف عن نوع MIME. وهذا يقلل من عدد المكالمات اللازمة لاكتشاف نوع الملف. السبب وراء هذا الاختيار هو أن هناك تنسيقات ملفات تستخدم كحاويات لتنسيقات ملفات أخرى. على سبيل المثال، ملفات Microsoft Office هي مجرد أرشيفات مضغوطة تحتوي على ملفات بيانات تعريف محددة. بمجرد تحديد الملف على أنه ملف مضغوط، ليست هناك حاجة للتحقق مما إذا كان ملفًا نصيًا، ولكن من المفيد التحقق مما إذا كان ملف Microsoft Office.
لمنع تحميل ملفات بأكملها إلى الذاكرة، عند الاكتشاف من القارئ أو من نوع ملف mimetype، يقتصر على قراءة رأس الإدخال فقط.
بفضل البنية الهرمية، والبحث عن التنسيقات الشائعة أولاً، والاقتصار على رؤوس الملفات، يطابق mimetype أداء stdlib http.DetectContentType
بينما يتفوق على الحزمة البديلة.
mimetype http.DetectContentType filetype
BenchmarkMatchTar-24 250 ns/op 400 ns/op 3778 ns/op
BenchmarkMatchZip-24 524 ns/op 351 ns/op 4884 ns/op
BenchmarkMatchJpeg-24 103 ns/op 228 ns/op 839 ns/op
BenchmarkMatchGif-24 139 ns/op 202 ns/op 751 ns/op
BenchmarkMatchPng-24 165 ns/op 221 ns/op 1176 ns/op
انظر CONTRIBUTING.md.