2011-07-06 48 views
15

xin chào Tôi đang cố gắng xác thực loại tệp được tải lên theo chức năng finfo_file.Loại tệp DOCX trong PHP finfo_file là ứng dụng/zip

Nhưng khi một tập tin .docx được gửi, loại tập tin là:

application/zip 

thay vì:

application/vnd.openxmlformats-officedocument.wordprocessingml.document 

thế nào tôi có thể thay đổi hành vi này?

+1

thực sự, định dạng x w {3} x mới được nén XML. bạn có thể thay đổi kết thúc thành **. zip ** và giải nén chúng. Tôi biết nó không giúp đỡ, nhưng nó tốt đẹp để biết: D – yoavmatchulsky

+0

giải nén tập tin cho các bài kiểm tra thực sự không phải là một giải pháp – WooDzu

+0

Các loại tập tin _is_ 'zip'. Nếu bạn muốn biết loại/định dạng của nội dung, không có cách nào để tìm kiếm _in_ nó. – KingCrunch

Trả lời

9

Theo tôi bây giờ, loại tệp cụ thể của nhà cung cấp (vnd.) Không được chuẩn hóa (bởi bất kỳ RFC nào) và do đó không được tập tin bởi file_info(). .docxzipped xml-format và đó là lý do, tại sao file_info() trả lại application_zip (điều gì là hoàn toàn đúng). Bạn có thể giải nén tệp và kiểm tra loại mime của kết quả, nhưng điều đó sẽ dẫn đến xml (điều gì là hoàn toàn chính xác) và các tệp khác, được sử dụng bởi tài liệu. Để khác biệt giữa các định dạng XML khác nhau, file_info() phải phân tích nội dung của nó và nó phải biết, nó trông như thế nào, những gì chỉ đi xa.

+0

Theo như tôi biết, trừ khi bạn trích xuất nội dung và kiểm tra chúng, không có gì để phân biệt bất kỳ tệp nén (jar, docx, odf, zip, v.v.) từ bất kỳ tệp nào khác. – Quentin

+0

có thể có một cách để đưa chúng vào php.ini một số làm thế nào? – WooDzu

+3

Thậm chí nếu php biết về loại mime: 'finfo_file()' được thiết kế để lấy loại tệp, không phải nội dung của tệp. Nó cũng không phải là dễ dàng để phân biệt giữa các cấu trúc phức tạp như vậy một cách rõ ràng. Bản thân tài liệu chỉ là 'application/xml', do đó bạn cần xem xét và phân tích nó. – KingCrunch

5

này là do một DOCX is a ZIP file:

Một Office Open XML file là một gói phần mềm OPC tương thích với ZIP có chứa tài liệu XML và các nguồn lực khác.

Giống như tệp Open Office, tài liệu là các tệp ZIP chứa nhiều tài nguyên khác nhau theo cách có cấu trúc và được xác định rõ. Vì vậy, khi bạn cố gắng xác định nội dung tệp, trước tiên bạn thấy rằng đó là tệp ZIP. Sau đó, bạn sẽ cần phải xem bên trong ZIP để quyết định xem đó là tệp DOCX hoặc OpenOffice. Thay vào đó, bạn có thể xem phần mở rộng của tệp: nếu bạn xác định tệp là mã ZIP và tiện ích mở rộng sẽ là .doc hoặc .docx thì bạn có thể giả sử tệp đó là tệp OOXML.

9

Tính năng này hoạt động trên debian. Thêm phần này vào/etc/magic:

#------------------------------------------------------------------------------ 
# $File: msooxml,v 1.1 2011/01/25 18:36:19 christos Exp $ 
# msooxml: file(1) magic for Microsoft Office XML 
# From: Ralf Brown <[email protected]> 

# .docx, .pptx, and .xlsx are XML plus other files inside a ZIP 
# archive. The first member file is normally "[Content_Types].xml". 
# 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 
# make sure the first file is correct 
>0x1E   string   [Content_Types].xml 
# 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 
>>>>&26   string   word/   Microsoft Word 2007+ 
!:mime application/msword 
>>>>&26   string   ppt/   Microsoft PowerPoint 2007+ 
!:mime application/vnd.ms-powerpoint 
>>>>&26   string   xl/    Microsoft Excel 2007+ 
!:mime application/vnd.ms-excel 
>>>>&26   default   x    Microsoft OOXML 
!:strength +10 

Sau đó, hãy nói với php sử dụng/etc/kỳ diệu vì nó là cơ sở dữ liệu:

$finfo = finfo_open(FILEINFO_MIME,"/etc/magic"); 
+0

Dựa trên http://serverfault.com/a/377792/51569 –

+0

THANKS. Tôi chắc chắn sẽ kiểm tra điều này !!! Bạn có nghĩ rằng nó sẽ làm việc với PHP open_basedir? – WooDzu

+0

Điều này rất hữu ích cho tôi khi tôi thử nghiệm tệp .docx và tôi đã tải lên tệp. Thử nghiệm trên hệ thống tệp cục bộ của tôi không hoạt động. – acorncom

0

On apache trong .htaccess thêm này, để sửa chữa docx và tất cả các sự cố loại tệp khác:

AddType application/vnd.ms-word.document.macroEnabled.12 .docm 
AddType application/vnd.openxmlformats-officedocument.wordprocessingml.document docx 
AddType application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx 
AddType application/vnd.ms-powerpoint.template.macroEnabled.12 potm 
AddType application/vnd.openxmlformats-officedocument.presentationml.template potx 
AddType application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam 
AddType application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm 
AddType application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx 
AddType application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm 
AddType application/vnd.openxmlformats-officedocument.presentationml.presentation pptx 
AddType application/vnd.ms-excel.addin.macroEnabled.12 xlam 
AddType application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb 
AddType application/vnd.ms-excel.sheet.macroEnabled.12 xlsm 
AddType application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx 
AddType application/vnd.ms-excel.template.macroEnabled.12 xltm 
AddType application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx 
Các vấn đề liên quan