간단히 그냥 루트에 있는 xml을 열어서 오피스에 해당하는 항목이 있는지를 체크해도 되는데, (방금 xslx 하나를 열어서 확인해보니 application/vnd.openxmlformats-officedocument.spreadsheetml 이런 내용이 있군요) 똑같은 파일을 zip으로 압축했을 경우랑 구분하기가 어려울듯 합니다. 확률적으로는 거의 일어나지 않을 일이겠지만.
요구하는 상황에 따라서는 "확장자가 docx이고, 파일 헤더가 zip이면 docx 파일이라고 본다"로 충분할 수도 있습니다. 어느정도 엄밀성을 요구하는지 숙고해보시기 바랍니다.
물론 요구사항이 유효성 검사까지 통과해야 하는 경우라면, 파일을 뜯어 보아야 겠지만 이것도 하다보면 한이 없습니다. 루트에 [Content_Types].xml 파일의 존재 여부만 테스트하는 정도면 무난하지 않을까 생각합니다.
#------------------------------------------------------------------------------
# $File: msooxml,v 1.3 2013/09/12 16:08:07 christos Exp $
# msooxml: file(1) magic for Microsoft Office XML
# From: Ralf Brown <ralf.brown@gmail.com>
# .docx, .pptx, and .xlsx are XML plus other files inside a ZIP
# archive. The first member file is normally "[Content_Types].xml".
# but some libreoffice generated files put this later. Perhaps skip
# the "[Content_Types].xml" test?
# Since MSOOXML doesn't have anything like the uncompressed "mimetype"
# file of ePub or OpenDocument, we'll have to scan for a filename
# which can distinguish between the three types
# start by checking for ZIP local file header signature
0 string PK\003\004
!:strength +10
# make sure the first file is correct
>0x1E string [Content_Types].xml
>>0 use msooxml
>0xE84 string [Content_Types].xml
>>0 use msooxml
0 name msooxml
# skip to the second local file header
# since some documents include a 520-byte extra field following the file
# header, we need to scan for the next header
>(18.l+49) search/2000 PK\003\004
# now skip to the *third* local file header; again, we need to scan due to a
# 520-byte extra field following the file header
>>&26 search/1000 PK\003\004
# and check the subdirectory name to determine which type of OOXML
# file we have. Correct the mimetype with the registered ones:
# <a href="http://technet.microsoft.com/en-us/library/cc179224.aspx
>>>&26" rel="nofollow">http://technet.microsoft.com/en-us/library/cc179224.aspx
>>>&26</a> string word/ Microsoft Word 2007+
!:mime application/vnd.openxmlformats-officedocument.wordprocessingml.document
>>>&26 string ppt/ Microsoft PowerPoint 2007+
!:mime application/vnd.openxmlformats-officedocument.presentationml.presentation
>>>&26 string xl/ Microsoft Excel 2007+
!:mime application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
>>>&26 default x Microsoft OOXML
file 명령어가 쓰는 방법을 올려 봅니다. 형식은 man magic 하시면 알 수 있습니다.
파일 헤더를 읽어드려서 구분하시나봐요 ㅎ
유사가 아니라 구조가 같습니다 ㅎ
1.xlsx -> 1.zip파일로 확장자 바꾸어서 압축풀면 xml이 나오죠
파일 헤더를 읽어드려서 구분하시나봐요 ㅎ
걍 확장자로 구분하면 안되나요^^?
zip를 이용했으므로 동일할수밖에 없습니다.
결국 헤더만으로는 불충분하고 안에 들어있는 내용까지 검사를 해야만 한다는 얘기.
표준 문서를 보고 작업하셔야 될듯 합니다.
http://www.ecma-international.org/publications/standards/Ecma-376.htm
누군가 해놓은 게 있을지도 모르겠지만요.
간단히 그냥 루트에 있는 xml을 열어서 오피스에 해당하는 항목이 있는지를 체크해도 되는데, (방금 xslx 하나를 열어서 확인해보니 application/vnd.openxmlformats-officedocument.spreadsheetml 이런 내용이 있군요) 똑같은 파일을 zip으로 압축했을 경우랑 구분하기가 어려울듯 합니다. 확률적으로는 거의 일어나지 않을 일이겠지만.
--
요구하는 상황에 따라서는 "확장자가 docx이고,
요구하는 상황에 따라서는 "확장자가 docx이고, 파일 헤더가 zip이면 docx 파일이라고 본다"로 충분할 수도 있습니다. 어느정도 엄밀성을 요구하는지 숙고해보시기 바랍니다.
물론 요구사항이 유효성 검사까지 통과해야 하는 경우라면, 파일을 뜯어 보아야 겠지만 이것도 하다보면 한이 없습니다. 루트에 [Content_Types].xml 파일의 존재 여부만 테스트하는 정도면 무난하지 않을까 생각합니다.
#----------------------------
file 명령어가 쓰는 방법을 올려 봅니다. 형식은 man magic 하시면 알 수 있습니다.
아!!! 일분 문자가
아!!! 일분 문자가 변형되는군요.
ftp://ftp.astron.com/pub/file/
에서 다운 받으시고, magic/Magdir/msooxml 파일입니다.
file 명령어
완전 사랑스러운 프로그램!!
댓글 달기