2015-04-24 2 views
2

Есть http.DetectContentType([]byte) функция в net/http упаковка. Но поддерживается только ограниченное количество типов. Как добавить поддержку docx, doc, xls, xlsx, ppt, pps, odt, ods, odp файлы не по расширению, а по содержанию. Насколько я знаю, есть некоторые проблемы, потому что файлы docx/xlsx//odp/odt имеют ту же подпись, что и файл zip (50 4B 03 04).Как определить дополнительный тип мим в Голанге

+1

https://golang.org/pkg/mime/ –

+1

@SalvadorDali Пакет mime полезен, но вопрос конкретно спрашивает об обнаружении на основе контента, а не расширения. – captncraig

ответ

1

Для файлов с x в конце относительно легко обнаружить. Просто разархивируйте его и прочитайте файл .rels/_rels. Он содержит путь к основному файлу в документе. Он обозначается пространством имен http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument. Просто проверьте его имя. Это document.xml для docx, workbook.xml для xlsx и presentation.xml для pptx.

Подробнее здесь можно найти здесь ECMA-376.

Двоичные форматы сложнее обнаружить. В общем, вы должны прочитать MS-CFB файловую систему и проверьте записи:

  • WordDocument для дока
  • Workbook или Book для XLS
  • PowerPoint Document для РРТА
  • EncryptedPackage означает файл зашифрован.
1

Там в настоящее время нет способа расширить http.DetectContentType, как он использует фиксированный неэкспортируемый кусочек «перехватчики»: https://golang.org/src/net/http/sniff.go (sniffSignatures по линии 49 на момент написания).

Кроме того, я быстро посмотрел на godoc.org в поисках лучшего пакета, но не нашел никаких расширяемых и ориентированных на контент, как вам нужно.

Моим советом было бы: создать собственный пакет, руководствуясь реализацией сниффера контента Go (который следует за https://mimesniff.spec.whatwg.org/).

Редактировать: Если вы хотите использовать CGO, и вы находитесь на nix, вы можете использовать libmagic bindings, например, https://github.com/jteeuwen/magic.

1

Я нашел mimemagic, который я считаю предпочтительным для magicmime, так как он не использует cgo. Но magicmime лучше разбирается между типами приложений/zip и офисных файлов.

Смежные вопросы