Intereting Posts
Slim Framework возвращает ответ без ответа «return $ response» Сгенерировать секретный код для сброса пароля Использование CakePHP FormHelper с формами Bootstrap Перенаправление страницы входа / регистрации WordPress на пользовательскую страницу входа / регистрации используя функцию PHP, но не указав параметры Как я могу изменить свой код для эхо-данных данных элемента child, где был найден мой поисковый запрос, в XMLReader? Заголовок Content-Length всегда равен нулю Проверка формы Laravel 5.2 не показывает ошибок? Запустить php-скрипт из командной строки с переменной PHP json_encode () в цикле while Преобразование таблицы Google в таблицу HTML Как я могу узнать, на какой странице установлено приложение Facebook или какая страница загружает мое приложение? Команды не синхронизированы; вы не можете запустить эту команду сейчас Запрос MSSQL возвращает неизвестный тип данных в поле даты CONVERT Переопределить зависимость базовой базы PHP в композиторе

Загруженные файлы docx, превращающиеся в zip-файлы

В настоящее время я использую symfony 1.4 и хочу разрешить пользователям загружать файлы Microsoft Word docx. Использование виджета sfWidgetFormInputFile и sfValidatorFile ниже пользователи могут выбирать и успешно загружать свои файлы 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.' )); 

Проблема в том, что после загрузки файла расширение изменяется на .zip, и файл содержит дерево файлов из xml-файлов. Я понимаю, что это потому, что Office 2007 теперь использует Open xml-файлы. Есть ли способ предотвратить это, используя symfony или PHP?

Solutions Collecting From Web of "Загруженные файлы docx, превращающиеся в zip-файлы"

Проблема заключается в том, что контент-обнюхивание. Новые форматы Office ARE .zip-файлы, и если при загрузке контент обнюхивается, браузер идентифицирует это как ZIP-файл и устанавливает заголовок Content-Type как таковой. Аналогично, при загрузке, если ваш сервер не устанавливает правильный заголовок ответа HTTP Content-Type, браузер предположит, что это ZIP-файл.

У Symfony 1.3+ есть опция mime_type_guessers для sfValidatorFile, которая позволяет вам определить ваш собственный гаджет типа mime PHP, который можно вызывать, или использовать встроенную функцию угадывания. Вызов любого из 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.' )); 

Кажется, это ошибка в обнаружении типа файла Symfony. Описывается обходной путь.

Предлагаемое использование mime_type_guessers использует несуществующую функцию. Если вы хотите использовать метод sfValidatorFile, вы должны написать array(array('sfValidatorFile', 'guessFromFileinfo')) . Предлагаемое решение вообще не использует обнаружение типа mime и приводит к проблемам с классическим форматом excel в моей системе.

Я исправил проблему, расширив класс sfValidatorFile и изменив метод getMimeType.

Создайте новый файл msValidatorFile.class.php в папке lib:

 <?php class msValidatorFile extends sfValidatorFile { protected function getMimeType($file, $fallback) { $arrayZips = array( "application/zip", "application/x-zip", "application/x-zip-compressed"); $officeTypes = array( "application/vnd.ms-word.document.macroEnabled.12", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.openxmlformats-officedocument.wordprocessingml.template", "application/vnd.ms-powerpoint.template.macroEnabled.12", "application/vnd.openxmlformats-officedocument.presentationml.template", "application/vnd.ms-powerpoint.addin.macroEnabled.12", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", "application/vnd.openxmlformats-officedocument.presentationml.slideshow", "application/vnd.ms-powerpoint.presentation.macroEnabled.12", "application/vnd.openxmlformats-officedocument.presentationml.presentation", "application/vnd.ms-excel.addin.macroEnabled.12", "application/vnd.ms-excel.sheet.binary.macroEnabled.12", "application/vnd.ms-excel.sheet.macroEnabled.12", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.ms-excel.template.macroEnabled.12", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"); foreach ($this->getOption('mime_type_guessers') as $method) { $type = call_user_func($method, $file); if (null !== $type && $type !== false) { if (in_array($type, $arrayZips) && in_array($fallback, $officeTypes)) { return $fallback; } return strtolower($type); } } return strtolower($fallback); } } 

Используйте этот новый валидатор в своем коде формы:

 $this->validatorSchema['file'] = new msValidatorFile(array('required' => false, 'path' => sfConfig::get('sf_upload_dir') ));