Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]Nie mogę uploadować plików .doc, docx, xls, xlsx na serwer
Forum PHP.pl > Forum > PHP > Frameworki
wiewiorek
Chcę zrobić upload plików: doc, docx, xls, xlsx, odt, ods i pdf więc mam taki formularz:
  1. class UploadDokumentowForm extends sfForm
  2. {
  3.  
  4. public function configure()
  5. {
  6. $this->setWidgets(array(
  7. 'dokument' => new sfWidgetFormInputFile(),
  8. 'opis' => new sfWidgetFormInput(array(), array('size' => 50)),
  9. ));
  10.  
  11. $this->widgetSchema->setNameFormat('plik[%s]');
  12.  
  13. $this->setValidators(array(
  14. 'dokument' => new sfValidatorFile(array(
  15. 'required' => true,
  16. 'path' => sfConfig::get('sf_upload_dir').'/dokumenty',
  17. 'mime_types' => array('application/vnd.ms-excel', 'application/msword', 'application/pdf',
  18. 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
  19. 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  20. 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet'),
  21. 'max_size' => '2097152', //2 MB
  22. ),
  23. 'required' => 'Proszę wybrać plik do załadowania.',
  24. 'max_size' => 'Plik jest większy niż 2 MB.',
  25. 'mime_types' => 'Dopuszczalne są tylko pliki .xls, .xlsx, .ods, .doc, .docx, .odt, .pdf.',
  26. )),
  27.  
  28. 'opis' => new sfValidatorString(array('max_length' => 200, 'required' => true),
  29. 'required' => 'Proszę podać opis pliku.',
  30. 'max_length' => 'Opis jest za długi. Może być maksimum %max_length% znaków.',
  31. )),
  32. ));
  33. }
  34.  
  35. }


I na moim lokalnym serwerze mogę uploadować wszystkie pliki podanych wyżej typów, a po przeniesieniu projektu na serwer linuxpl.com mogę uploadować tylko pliki typu: odt, ods i pdf. Natomiast plików doc, docx, xls, xlsx - nie mogę - dostaję swój własny komunikat błędu:
Dopuszczalne są tylko pliki .xls, .xlsx, .ods, .doc, .docx, .odt, .pdf.

Nie rozumiem dlaczego na moim serwerze jest ok, a na linuxpl.com nie questionmark.gif :/
Wojciech Bańcer
Myślę, że powyższe rozszerzenia nie są po prostu dodane do typów na serwerze i funkcje validatora ich nie umieją rozpoznać.

Przejrzyj kod źródłowy pliku symfony lib/validator/sfValidatorFile.class.php - jest tam opcja 'mime_type_guessers' oraz komentarz:

  1. * There are 3 built-in mime type guessers:
  2. *
  3. * * guessFromFileinfo: Uses the finfo_open() function (from the Fileinfo PECL extension)
  4. * * guessFromMimeContentType: Uses the mime_content_type() function (deprecated)
  5. * * guessFromFileBinary: Uses the file binary (only works on *nix system)


pokombinuj z natywnymi które są tam dostarczone (myślę, że ta z Fileinfo powinna dać najlepsze rezultaty), a jak żadna z nich nie będzie umiała rozpoznać Twoich plików, to pozostaje Ci napisanie własnej funkcji odgadującej, np. na podstawie rozszerzenia pliku.
wiewiorek
Rzeczywisty komunikat błędu dla plików .doc i .xls to:
Invalid mime type (application/octet-stream).

A dla plików .docx i .xlsx:
Invalid mime type (application/zip).

Więc jest to chyba związane z ustawieniami serwera skoro nie rozpoznaje tych typów mime ?
cim
Witam,

chyba tak właśnie jest, że listę typów plików MIME pobiera z konfiguracji serwera. phpinfo() na temat MIME ma do powiedzenia tyle co poniżej (wskazuje na plik z którego czyta systemowy program 'file' więc wychodzi na to, że jest to zależne od systemu na którym skrypt jest uruchamiany).

Kod
mime_magic
mime_magic support    invalid magic file, disabled

Directive    Local Value    Master Value
mime_magic.debug    Off    Off
mime_magic.magicfile    /usr/share/file/magic.mime    /usr/share/file/magic.mime


Pozdrawiam
wiewiorek
Tak jak radził Wojciech dałem w sfValidatorFile:
  1. 'mime_type_guessers'=>array('guessFromFileinfo', 'guessFromFileBinary'),


czyli:
  1. $this->setValidators(array(
  2. 'dokument' => new sfValidatorFile(array(
  3. 'mime_type_guessers'=>array('guessFromFileinfo', 'guessFromFileBinary'),
  4. 'required' => true,
  5. 'path' => sfConfig::get('sf_upload_dir').'/dokumenty',
  6. 'mime_types' => array('application/vnd.ms-excel', 'application/msword', 'application/pdf',
  7. 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
  8. 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  9. 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet'),
  10. 'max_size' => '2097152', //2 MB
  11. ),
  12. 'required' => 'Proszę wybrać plik do załadowania.',
  13. 'max_size' => 'Plik jest większy niż 2 MB.',
  14. 'mime_types' => 'Dopuszczalne są tylko pliki .xls, .xlsx, .ods, .doc, .docx, .odt, .pdf.',
  15. )),
  16.  
  17. 'opis' => new sfValidatorString(array('max_length' => 200, 'required' => true),
  18. 'required' => 'Proszę podać opis pliku.',
  19. 'max_length' => 'Opis jest za długi. Może być maksimum %max_length% znaków.',
  20. )),
  21. ));
  22.  


i wyglada na to, że teraz jest ok, poprawnie rozpoznaje mime type, tylko czy to nie jest tak że guessFromFileinfo jest domyślna metodą rozpoznawania typów mime ? Więc nie bardzo rozumiem czemu teraz działa jak usunąłem guessFromMimeContentType skoro guessFromFileinfo była domyślną metodą ?
-=Peter=-
Popatrz w jaki sposób ten walidator ustala mime type.

  1. [...]
  2. foreach ($this->getOption('mime_type_guessers') as $method)
  3. {
  4. $type = call_user_func($method, $file);
  5.  
  6. if (null !== $type && $type !== false)
  7. {
  8. return strtolower($type);
  9. }
  10. }
  11. [...]

Nie sprawdzałem tego (bo tak naprawdę nie mam jak ;]), ale najprawdopodobniej funkcja zwrotna wykorzystująca fileinfo w Twoim przypadku zwraca zawsze null, funkcja wykorzystująca "mime_content_type" zwracała wadliwy mime type, dopiero trzecia funkcja zwraca w Twoim przypadku "dobry" mime type. Usunąłeś tą środkową funkcję więc sprawdzane mime pochodzi z metody guessFromFileBinary, a nie guessFromMimeContentType jak było wcześniej.
wiewiorek
Też tak sądziłem - dlatego sprawdziłem jeszcze zostawiając tylko i wyłącznie guessFromFileinfo:
  1. 'mime_type_guessers'=>array('guessFromFileinfo'),


i rozpoznawało poprawnie typy mime, dziwne.... smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.