xlsx, pptx, docx 같은 문서 압축파일과 zip 파일을 구분하는 방법을 알고 싶습니다.

trymp의 이미지

xlsx, pptx, docx 같은 office 문서파일이 압축파일 형태를 같고 있잖아요

그런데 이것이 zip 과 아주 유사해서 파일타입을 식별하는데 애를 먹고 있습니다.

zip 과 이런 문서압축파일을 구분하는 방법을 알고 계신 분 있으면 좀 도와주십시요.

고수님들의 조언 부탁드립니다.

red10won의 이미지

유사가 아니라 구조가 같습니다 ㅎ
1.xlsx -> 1.zip파일로 확장자 바꾸어서 압축풀면 xml이 나오죠

파일 헤더를 읽어드려서 구분하시나봐요 ㅎ

걍 확장자로 구분하면 안되나요^^?

mirheekl의 이미지

결국 헤더만으로는 불충분하고 안에 들어있는 내용까지 검사를 해야만 한다는 얘기.

표준 문서를 보고 작업하셔야 될듯 합니다.
http://www.ecma-international.org/publications/standards/Ecma-376.htm

누군가 해놓은 게 있을지도 모르겠지만요.

간단히 그냥 루트에 있는 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 하시면 알 수 있습니다.
익명 사용자의 이미지

아!!! 일분 문자가 변형되는군요.
ftp://ftp.astron.com/pub/file/
에서 다운 받으시고, magic/Magdir/msooxml 파일입니다.

Anti-Lock의 이미지

완전 사랑스러운 프로그램!!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.