PHP finfo_file中的DOCX文件类型是application / zip

时间:2011-07-06 10:49:34

标签: php validation docx file-type

你好我正在尝试通过 finfo_file 函数验证上传的文件类型。

但是当发送.docx文件时,文件类型为:

application/zip

而不是:

application/vnd.openxmlformats-officedocument.wordprocessingml.document

如何更改此行为?

6 个答案:

答案 0 :(得分:10)

就我而言,供应商特定的文件类型(vnd。)没有标准化(由任何RFC),因此不被file_info()覆盖。 .docxzipped xml-format,这就是原因,file_info()返回application_zip的原因(完全正确)。您可以解压缩文件并测试结果的mime类型,但这将导致xml(也是完全正确的)和文档使用的其他文件。要区分不同的XML格式,file_info()必须分析其内容,并且必须知道它的外观,到目前为止的内容。

答案 1 :(得分:9)

这适用于debian。将其添加到/ 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 <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".
# 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

然后,告诉php使用/ etc / magic作为它的数据库:

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

答案 2 :(得分:5)

这是因为DOCX is a ZIP file

  

Office Open XML文件是ZIP兼容的OPC包,包含XML文档和其他资源。

与Open Office文件一样,这些文档是包含各种资源的ZIP,结构清晰,定义明确。因此,当您尝试识别文件内容时,首先会看到它是一个ZIP文件。然后,您需要查看ZIP内部以确定它是DOCX还是OpenOffice文件。

作为替代方案,您可以查看文件扩展名:如果您将文件标识为ZIP并且扩展名恰好是.doc.docx,那么您可以认为它是一个OOXML文件。

答案 3 :(得分:1)

在.htaccess中的apache上添加此项,以修复docx和所有其他文件类型问题:

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

答案 4 :(得分:0)

我们在PHP 5.3中遇到了同样的问题。 在PHP 7.2下工作正常。我的docx文件有application / vnd.openxmlformats-officedocument.wordprocessingml.document。

要确保在PHP 5.3下具有docx文件,请从存档(docx)中的 [Content_Types] .xml 文件中检查MIME类型。

答案 5 :(得分:0)

在此主题中查看我的答案:

  

概述

     

PHP使用libmagic。当Magic检测到MIME类型为   “应用程序/邮政编码”而不是   “ application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”,   这是因为添加到ZIP存档的文件必须位于   一定顺序。

     

在将文件上传到强制执行的服务时会导致问题   匹配文件扩展名和MIME类型。例如,基于Mediawiki   Wiki(使用PHP编写)阻止了某些XLSX文件   已上传,因为它们被检测为ZIP文件。

     

您需要做的是通过重新排序写入的文件来修复XLSX   到ZIP存档,以便Magic可以正确检测MIME类型。

     

...

帖子继续分析文件并通过重写文件来开发解决方案。

这是使用Word创建的DOCX文件的文件列表。

public void onBindViewHolder(@NonNull final CardTasarimTutucu holder, int position) {

        SharedPreferences sp = mContext.getSharedPreferences("checked",Context.MODE_PRIVATE);

        e=sp.edit();
        sharedP= new ArrayList<>();
        word = words.get(position).getMean();
        Log.e("getMean",word);
        id= words.get(position).getId();
        str= new StringBuffer("");

        holder.rowText.setText(word);
        holder.rowText.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (holder.rowText.isChecked()) {

                    sharedP.remove(sharedP.indexOf(word));
                    flag=false;
                    holder.rowText.setCheckMarkDrawable(null);
                    holder.rowText.setChecked(false);

                } else {

                    sharedP.add(word);
                    flag=true;
                    Log.e("deneme",word);
                    holder.rowText.setCheckMarkDrawable(R.drawable.ic_check_black_24dp);
                    holder.rowText.setChecked(true);

                }

                str.delete(0,str.length());
                for(int i=0;i<sharedP.size();i++){
                    Log.e("sharedpreference1",sharedP.get(i).toString());
                    str.append(sharedP.get(i));
                    str.append(".");

                }
                if(flag==false){
                    e.remove("str");
                    e.commit();
                }
                Log.e("size",str.toString());
                e.putString("str", str.toString());
                e.remove("set");

                e.commit();

            }

        });




    }

您可能必须模仿该文件顺序,或者先尝试在其他文件之前写入“ [Content_Types] .xml”,“ word / document.xml”和“ word / styles.xml”文件。