상세 컨텐츠

본문 제목

[Golang]파일 타입 알고 싶을 때 DetectContentType

Golang

by stayhungri 2022. 6. 9. 23:31

본문

확장자를 보면 파일 타입을 알 수 있지만, 정말로 그런지 아니면 byte 정보로 저장되어 있는 파일의 타입이 무엇인지 궁금할 때가 있습니다.

이럴 때는 http 패키지에 DetectContentType() 함수를 이용하면 됩니다.

 

func checkFileType() {
	file, err := os.Open("./whyoh1.jpg")
	if err != nil {
		log.Fatalf("failed to open file: %+v", err)
	}
	defer file.Close()

	buffer := make([]byte, size)
	file.Read(buffer)
	fileType := http.DetectContentType(buffer)

	log.Printf("file type: %s", fileType)
}

// file type: image/jpeg

DetectContentType() 함수는 해당 파일이 어떤 MIME 타입인지 알려줍니다. 어떤 파일 타입인지 알아내기 위해 파일의 첫 512 바이트를 가지고 와서 검사합니다. DetectContentType() 함수 관련 코드를 보면 각 파일 타입별 signature 값들을 가지고 있는 것을 볼 수 있습니다.

// Data matching the table in section 6.
var sniffSignatures = []sniffSig{
	htmlSig("<!DOCTYPE HTML"),
	htmlSig("<HTML"),
	htmlSig("<HEAD"),
	//...
	&maskedSig{
		mask: []byte("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"),
		pat:  []byte("MThd\x00\x00\x00\x06"),
		ct:   "audio/midi",
	},
	&exactSig{[]byte("\x89PNG\x0D\x0A\x1A\x0A"), "image/png"},
	&exactSig{[]byte("\xFF\xD8\xFF"), "image/jpeg"},
	//...
}

정확한 동작 방식이 궁금하시다면 여기(MIME Sniffing)를 참고해주세요

 

파일 타입을 찾을 수 없다면 "application/octet-stream" 을 반환합니다.

 

 

참고

- http.DetectContentType

https://pkg.go.dev/net/http#DetectContentType

 

- MIME Sniffing
https://mimesniff.spec.whatwg.org/

관련글 더보기