file->getMimeType() 总是使用 Zend 框架返回 application/octet-stream

Posted

技术标签:

【中文标题】file->getMimeType() 总是使用 Zend 框架返回 application/octet-stream【英文标题】:file->getMimeType() always returns application/octet-stream with Zend Framework 【发布时间】:2011-01-23 08:41:59 【问题描述】:

我的文件表单元素很简单:

$this->archivo = new Zend_Form_Element_File('archivo');
$this->archivo->setLabel('Archivo:')
        ->setRequired(true)
        ->setDestination(UPLOAD_PATH)
        ->addValidator('Count', false, 1)
        ->addValidator('Size', false, MAX_FILE_SIZE)
        ->addValidator('Extension', false, Application_Form_Multimedia_SubirArchivo::EXTENSIONES_PERMITIDAS);
$this->addElement($this->archivo);

但是,在上传文件时(上传OK),我尝试获取 MIME 类型,但每个文件都相同:

$form->archivo->getMimeType()

无论我要上传哪种文件,它总是返回 application/octet-stream

为什么会发生这种情况,我是不是错过了什么?谢谢

【问题讨论】:

【参考方案1】:

Octet-Stream 通常是必须在另一个应用程序中打开的任何文件。见:

http://kb.iu.edu/data/agtj.html

包含内容的 MIME 附件 类型“应用程序/八位字节流”是 二进制文件。通常,它将是一个 申请或必须提交的文件 在应用程序中打开,例如 电子表格或文字处理器。如果 附件有文件扩展名 与它相关联,您也许可以 告诉它是什么类型的文件。一个.exe 例如,扩展名表示它 是 Windows 或 DOS 程序 (可执行文件),而文件结尾 .doc 可能意味着在 微软Word。

【讨论】:

【参考方案2】:

最可能的原因是,如果您的 php 安装中的 fileinfo 或 mime_magic 扩展均不可用,那么您使用的底层方法将回退到默认的 mimetype:

if (empty($result[$key])) 
    $result[$key] = 'application/octet-stream';

建议您检查 Zend_File_Transfer_Adapter_Abstract 中的 getMimeType() 方法 - 该 sn-p 来自哪里,并从 Zend_Form_Element_File::getMimeType() 中调用 - 了解详细信息,然后检查您安装了哪些扩展并适当地纠正。

【讨论】:

【参考方案3】:

今天 Zend Framework 是 1.11.10,这个问题的解决方案没有从 ZF2 向后移植。这里是bug report。

here is the patch。补丁的想法是在 php5.3 中 mimefile 包含在 php 中,我们不再需要外部文件。

此外,要使用此修复程序,您应该像这样添加验证器:

$upload->addValidator('IsImage', false, array('magicfile'=>false));

【讨论】:

好答案。我的问题肯定是过时的 ZF1 Zend_Validate_File_MimeType。喜欢删除代码行来解决问题。

以上是关于file->getMimeType() 总是使用 Zend 框架返回 application/octet-stream的主要内容,如果未能解决你的问题,请参考以下文章

为啥 $_FILES 超级全局总是空的

进度回调总是在jquery-file-upload插件中显示100%上传

为啥我用这段php上传代码总是出现这个问题?

ParsleyJS 自定义验证器总是验证失败

File.Exists() 在 IIS 上总是返回 false

检查文件是不是存在? file.exists() 总是返回 false