확장자를 보면 파일 타입을 알 수 있지만, 정말로 그런지 아니면 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/
[Golang]PNG 파일 JPG 로 변환하기 (0) | 2022.06.24 |
---|---|
[Golang]config 파일 관리는 viper 괜찮아요 (0) | 2022.06.16 |
[Golang]사용하고 있는 패키지들 언제 어떻게 업그레이드 하지? (0) | 2022.06.09 |
[Golang]golang-jwt/jwt 에서 golang-jwt/jwt 마이그레이션 (0) | 2022.06.03 |
[Golang]숫자에 쉼표 삽입 (Thousands Separator) (0) | 2021.08.15 |