你好我正在尝试通过 finfo_file 函数验证上传的文件类型。
但是当发送.docx文件时,文件类型为:
application/zip
而不是:
application/vnd.openxmlformats-officedocument.wordprocessingml.document
如何更改此行为?
答案 0 :(得分:10)
就我而言,供应商特定的文件类型(vnd。)没有标准化(由任何RFC),因此不被file_info()覆盖。 .docx
是zipped 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”文件。