Yüklenen docx dosyaları zip dönüşüyor

4 Cevap php

Şu anda Symfony 1.4 kullanıyorum ve kullanıcıların Microsoft Word'ün docx dosyalarını yüklemek için izin istiyorum. Kullanıcılar aşağıda sfWidgetFormInputFile Widget ve sfValidatorFile kullanarak seçin ve başarılı basit bir web formu kullanarak docx dosya upload edebiliyoruz.

$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.'
));

Sorun dosya karşıya sonra, uzatma. Zip değişti ve dosya xml dosyaları bir dosya ağacı içeriyor olmasıdır. Benim anlayış, Office 2007 artık Open XML dosya biçimlerini kullanarak çünkü bu olmasıdır. Symfony veya PHP kullanarak Bunu önlemek için herhangi bir yolu var mı?

4 Cevap

Symfony 1.3 + kendi mime tipi tahminci PHP çağrılabilir tanımlamak veya tahminci bir yapı kullanmanızı sağlar mime_type_guessers sfValidatorFile için bir seçenek vardır. 3 dahili mime tipi guessers herhangi çağırarak docx için doğru dosya türünü bulur ve docx dosya uzantısı tutar.

İşte guessFromFileinfo kullanarak güncellenmiş kodu:

$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.'
));

Sorun İçerik-kokluyor. Yeni Office formatları. Zip dosyaları ARE, ve upload, içerik kokladı ise, tarayıcı bir ZIP dosyası olarak tanımlamak ve bu gibi Content-Type başlığını koyacaktır. Benzer şekilde, download sunucu doğru Content-Type HTTP yanıt başlığını ayarlar sürece, tarayıcı bu bir ZIP dosyası olduğunu varsayar.

Bu Symfony'nin dosya türü algılama bir bug gibi görünüyor. Bir geçici çözüm tarif edilmektedir.

The suggested use of mime_type_guessers uses a non-existing function. If you want to use the sfValidatorFile method, you should write array(array('sfValidatorFile', 'guessFromFileinfo')). The suggested solution uses no mime-type detection at all and results in problems with the classic excel format on my system.

Ben sfValidatorFile sınıfını genişleten ve getMimeType yöntemini değiştirerek sorunu giderildi.

Lütfen lib klasörüne yeni msValidatorFile.class.php dosyası oluşturun:

<?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);
  }
}

Form kodunda bu yeni validator kullanabilirsiniz:

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