在我的Symfony应用程序中,我想在文件上传期间将zip文件设置为mime类型之一,执行此操作的代码如下:
$this->validatorSchema ['Documents'] = new sfValidatorFile (
array ('mime_types' => array(
'application/zip',
'image/jpeg',
'image/pjpeg',
'image/png',
'image/x-png',
'image/gif',
'application/x-zip',
'application/octet-stream',
'application/pdf') ),
array ('invalid' => 'Invalid file.',
'required' => 'Select a file to upload.',
'mime_types' => 'The file must be of JPEG, PNG , GIF, pdf and zip format.' ) );
但是,当我上传时,我发现可以上传所有pdf
,png
,gif
等。唯一无法上传的mime类型是以.zip
结尾的文件。
这里出了什么问题?
我问了一个相关但不同的问题here。
注意:我使用的是Symfony 1.2.7
编辑:我使用不同的浏览器做了一些进一步的测试。 Firefox 3的工作原因是“application / octet-stream”,而IE的工作原因是“application / x-zip-compressed”,而Google Chrome根本不起作用。
答案 0 :(得分:1)
在more testing之后,我相信Symfony中的this is a bug。
答案 1 :(得分:0)
执行echo或error_log以查看$ uploaded_file-> getMime()[或任何正确的方法调用]返回的zip文件。
如果您获得的字符串是传递给数组的字符串之一,则可能存在sfValidatorFile的错误(我从未使用过它),您可能想尝试使用yml验证器。
答案 2 :(得分:0)
这是mime类型检测的问题。 sfValidatorFile可以使用用户提供的函数来确定mime类型。因此,如果由验证器确定的mime类型不能正常工作,您可以编写自己的函数来检测上传文件中的zip文件。
link to documentation,请查看解释文件上传的页面末尾。
答案 3 :(得分:0)
有一个解决方案:
在“/ lib / Validator /”中创建“sfValidatorFileZip.class.php”。这个类从commun“sfValidatorFile”扩展而来,它包含下面列出的“configure”方法:
class sfValidatorFileZip extends sfValidatorFile{
protected function configure($options = array(), $messages = array()){
if (!ini_get('file_uploads'))
{
throw new LogicException(sprintf('Unable to use a file validator as "file_uploads" is disabled in your php.ini file (%s)', get_cfg_var('cfg_file_path')));
}
$this->addOption('max_size');
$this->addOption('mime_types');
$this->addOption('mime_type_guessers', array(
array($this, 'guessFromFileinfo'),
array($this, 'guessFromMimeContentType'),
array($this, 'guessFromFileBinary'),
));
$this->addOption('mime_categories', array(
'web_images' => array(
'image/jpeg',
'image/pjpeg',
'image/png',
'image/x-png',
'image/gif',
),
'zip_file' => array(
'application/zip'
)
));
$this->addOption('validated_file_class', 'sfValidatedFile');
$this->addOption('path', null);
$this->addMessage('max_size', 'File is too large (maximum is %max_size% bytes).');
$this->addMessage('mime_types', 'Invalid mime type (%mime_type%).');
$this->addMessage('partial', 'The uploaded file was only partially uploaded.');
$this->addMessage('no_tmp_dir', 'Missing a temporary folder.');
$this->addMessage('cant_write', 'Failed to write file to disk.');
$this->addMessage('extension', 'File upload stopped by extension.');
}
}
,小部件将是您的自定义“sfValidatorFileZip”中的实例,您必须精确地'mime_types' => 'zip_file'
。例如:
$this->setValidator('filename', new sfValidatorFileZip(array(
'required' => false,
'mime_types' => 'zip_file',
'path' => sfConfig::get('sf_upload_dir') . '/files/',),
array('required' => 'filename is required.', 'mime_types' => 'only ZIP is accepted')));