上传的docx文件变成了zip

mar*_*rkb 4 php apache symfony1 symfony-1.4

我目前正在使用symfony 1.4,并希望允许用户上传Microsoft Word docx文件.使用下面的sfWidgetFormInputFile小部件和sfValidatorFile,用户可以使用简单的Web表单选择并成功上传他们的docx文件.

$this->widgetSchema['file_name'] = new sfWidgetFormInputFile(array('label' => 'File'));

$this->validatorSchema['file_name'] = new sfValidatorFile(array(
  'required'   => true,
  'path'       => sfConfig::get('sf_upload_dir').DIRECTORY_SEPARATOR.sfConfig::get('app_dir_file_sharing').DIRECTORY_SEPARATOR,
  'mime_types' => array('application/msword',
                        'application/vnd.ms-word',
                        'application/msword',
                        'application/msword; charset=binary')
), array(
    'invalid'    => 'Invalid file.',
    'required'   => 'Select a file to upload.',
    'mime_types' => 'The file must be a supported type.'
));
Run Code Online (Sandbox Code Playgroud)

问题是文件上传后,扩展名更改为.zip,文件包含xml文件的文件树.我的理解是,这是因为Office 2007现在使用Open xml文件格式.有没有办法防止这种情况发生使用symfony或PHP?

Eri*_*Law 6

问题是Content-Sniffing.新的Office格式为.zip文件,如果在上传时内容被嗅探,浏览器会将其识别为ZIP文件并设置Content-Type标头.同样,除非您的服务器设置正确的Content-Type HTTP响应标头,否则在下载时,浏览器将假定这是一个ZIP文件.


mar*_*rkb 5

Symfony 1.3+有一个sfValidatorFile选项mime_type_guessers,它允许你定义你自己的mime类型guesser PHP可调用或使用guesser构建.调用3个内置的mime类型猜测器中的任何一个都可以找到docx的正确文件类型并保留docx文件扩展名.

以下是使用guessFromFileinfo的更新代码:

$this->validatorSchema['file_name'] = new sfValidatorFile(array(
'required'   => true,
'path'       => sfConfig::get('sf_upload_dir').DIRECTORY_SEPARATOR.sfConfig::get('app_dir_file_sharing').DIRECTORY_SEPARATOR,
'mime_type_guessers' => array('guessFromFileinfo'),
'mime_types' => array('application/msword',
                    'application/vnd.ms-word',
                    'application/msword',
                    'application/msword; charset=binary')
), array(
    'invalid'    => 'Invalid file.',
    'required'   => 'Select a file to upload.',
    'mime_types' => 'The file must be a supported type.'
));
Run Code Online (Sandbox Code Playgroud)