h2non / filetype

Fast, dependency-free Go package to infer binary file types based on the magic numbers header signature
https://pkg.go.dev/github.com/h2non/filetype?tab=doc
MIT License
2.1k stars 175 forks source link

Matches .doc as application/vnd.ms-excel #40

Open rahulganguly opened 6 years ago

rahulganguly commented 6 years ago

I am trying to detect the MIME type of a .doc file, and the result I get is of type File type: xls. MIME: application/vnd.ms-excel or ile type: ppt. MIME: application/vnd.ms-powerpoint

rahulganguly commented 6 years ago

under the matchers folder

matchers/document.go

The func Doc(), func Xls() and func Ppt() all have the same magic numbers.

return len(buf) > 7 &&
    buf[0] == 0xD0 && buf[1] == 0xCF &&
    buf[2] == 0x11 && buf[3] == 0xE0 &&
    buf[4] == 0xA1 && buf[5] == 0xB1 &&
    buf[6] == 0x1A && buf[7] == 0xE1

Is this the reason why the MimeType is always coming up different?

h2non commented 6 years ago

Microsoft Office container files are zip containers. I don't know a reliable way to detect old Office formats. If you find it, feel free to submit a PR.

mateusmaaia commented 5 years ago

@kumakichi It's working?

kumakichi commented 5 years ago

@mateusmaaia It should work, if you found some MS office files can not be detected correctly, please let me know

0xMadao commented 5 years ago

@mateusmaaia It should work, if you found some MS office files can not be detected correctly, please let me know

hi there, the doc file still be detected as a ppt file type

kumakichi commented 5 years ago

@mateusmaaia @jeremywu0127

Oh, I was wrong

48 only add support for docx/xlsx/pptx(even not very good), leave doc/xls/ppt untouched

So, extra work is needed

kumakichi commented 5 years ago

@jeremywu0127

doc/xls/ppt check will be a little complex, we can detect they are Composite Document File V2 Document, but we don't know which one it is (doc/xls/ppt).

Maybe we can check the name of creating application, get something like: Microsoft Office Word, it's OK; but if files are created by some none ms-office applications, say:WPS, we know nothing.

So, this problem is not easy to resolve

mateusmaaia commented 5 years ago

Yes, I tried a few stuffs but ended validating the content-type header if it's doc/ppy/xls, not the best solution but still works for what I need.

Anyway, thanks! @kumakichi

messense commented 3 years ago

@jeremywu0127

doc/xls/ppt check will be a little complex, we can detect they are Composite Document File V2 Document, but we don't know which one it is (doc/xls/ppt).

Maybe we can check the name of creating application, get something like: Microsoft Office Word, it's OK; but if files are created by some none ms-office applications, say:WPS, we know nothing.

So, this problem is not easy to resolve

You can detect them by checking GUID of the root entry according to https://stackoverflow.com/questions/29211263/how-to-identify-doc-docx-pdf-xls-and-xlsx-based-on-file-header/48318648#48318648 , implemented in the Rust version https://github.com/bojand/infer/pull/38