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 과 같은 라이브러리만 사용하십시오. 매직 넘버를 사용한 콘텐츠 유형 감지는 느리고 부정확하며 비표준입니다. 대부분의 프로토콜에는 그러한 메타데이터를 지정하는 방법이 있습니다. 예를 들어 HTTP 및 SMTP의 Content-Type
헤더입니다.
Q: 내 파일이 지원되는 MIME 유형 목록에 있지만 올바르게 감지되지 않습니다. 어떻게 해야 하나요?
A: 일부 파일 형식(종종 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 파일은 특정 메타데이터 파일이 포함된 zip 아카이브일 뿐입니다. 파일이 zip으로 식별되면 텍스트 파일인지 확인할 필요가 없지만 Microsoft Office 파일인지 확인하는 것이 좋습니다.
전체 파일을 메모리에 로드하는 것을 방지하기 위해 리더 또는 파일 MIME 유형 에서 감지할 때 입력 헤더만 읽는 것으로 제한됩니다.
일반적인 형식을 먼저 검색하고 파일 헤더로 제한하는 계층 구조 덕분에 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를 참조하세요.