Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF]Zend_Form_Element_File jak zmienić nazwę uplodowanego pliku
Forum PHP.pl > Forum > PHP > Frameworki
amii
J/W potrzebuje zmienić nazwę pliku pobieranego przez usera i uploadowanego na serwer
Pilsener
No dobrze, ale:
- gdzie jest problem?
- co ma z tym wspólnego element formularza?

Przecież w każdym uploadzie:
- odbierasz plik, który ma tymczasową nazwę
- zapisujesz go pod nazwą jaką chcesz

Proszę o jakiś fragment kodu, bo nie jestem pewien czy dobrze rozumiem, przecież robisz tak:
  1. $file = $form->File->getFileInfo();


I masz to samo co w tablicy $_FILES
kalipek
Dla pojedynczego pliku:

  1. $originalFilename = pathinfo($form->element->getFileName());
  2. $newName = rand(1,100) . time() . '.' .$originalFilename['extension'];
  3. $form->element->addFilter('Rename', $newName);
  4.  
  5. $values = $form->getValues();


Dla kilku:

  1. $upload = new Zend_File_Transfer_Adapter_Http();
  2. $upload->setDestination(realpath(APPLICATION_PATH .'/../public/path/to/files'));
  3. $files = $upload->getFileInfo();
  4.  
  5. $arrFileName = array();
  6. $countFileUpload = count($files);
  7. if($countFileUpload > 0 )
  8. {
  9. $i = 1;
  10.  
  11. foreach ($files as $file => $info){
  12. if($info['name'] != '')
  13. {
  14.  
  15. $file_name = $upload->getFileName($info['name']);
  16. preg_match("/\.([^\.]+)$/", $file_name, $matches);
  17.  
  18. $file_ext = $matches[1];
  19.  
  20. if($countFileUpload > 1)
  21. {
  22. $file_name = rand(1,100) . time() . '-' . $i . '.' .$file_ext;
  23. }
  24. else
  25. {
  26. $file_name = rand(1,100) . time() . '.' .$file_ext;
  27. }
  28. $arrFileName[$file] = $file_name;
  29.  
  30. $upload->addFilter('Rename', 'path/to/files' .'/' . $file_name);
  31. $i++;
  32.  
  33. $upload->receive($file);
  34. }
  35. }
  36. }
  37.  
  38. $values = $form->getValues();


getValues() zawsze dopiero po zmianie
amii
Może opiszę dokładnie co chcę osiągnąć:
1. Kiedy uploaduje się plik chce filtrować jego nazwę (usuwane polskie zanki, spacje i znaki specjalne)
2. Nazwa przefiltrowanego pliku jest zapisywana w bazie a plik jest zapisywany w katalogu public/uploads
3. Poprzedni plik skojarzony z tym rekordem jest usuwany

Dwa pierwsze punkty udalo mi się zrobić filtrem, natomiast jest problem z pkt. 3, poniżej fragment akcji:
Pracuję na localhost na Windows 7 kiedy wyświetlam:
$fld dostaję : C:\wamp\www\learning\public\uploads
$fld . '/' . $plik : C:\wamp\www\learning\public\uploads/audyt-dla-strony-http.doc
$fld . '\\' . $plik : C:\wamp\www\learning\public\uploads\audyt-dla-strony-http.doc
realpath($fld . '/' . $plik) : ''
realpath($fld . '\\' . $plik) : ''

  1.  
  2. //usuwanie poprzedniego pliku
  3. $fld = realpath(APPLICATION_PATH . '/../public/uploads');
  4. $plik = $DbTable->getFile($eid); //pobranie z bazt nazwy pliku
  5. $np = realpath($fld . '/' . $plik);
  6.  
  7. if (file_exists($np))
  8. {
  9. chmod($np, 0777);
  10. unlink($np);
  11. }



EDIT:
Problem jest gdzie indziej niż w ścieżce. Mam taki filtr:
Ten filtr działa ok pod tym względem, że nazwa pliku jest filtrowana i zapisywana w bazie prawidłowo. Dla przykładu dla pliku: badanie-konkurencji-szkolenia -Łódź.xls
w bazie jest zapisywany: badanie-konkurencji-szkolenia-d.xls, natomiast w katalogu uploads jest zapisywany: badanie-konkurencji-szkolenia -Łódź.xls
czyli plik skrzaczony i nie filtrowany

  1. class My_Filters_Uploader implements Zend_Filter_Interface
  2. {
  3. public function filter($value)
  4. {
  5. // perform some transformation upon $value to arrive on $valueFiltered
  6. $file = pathinfo($value);
  7. $valueFiltered = My_Slugs::string2slug($file['filename']);
  8.  
  9. return $valueFiltered . '.' . $file['extension'];
  10. }
  11. }
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.