Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zapis do ZIP
Forum PHP.pl > Forum > Przedszkole
sadistic_son
Cześć.
Tworzę archiwum ZIP z plikami txt. Odbywa się to w pętli. Skrypt tworzy pliki txt na podstawie predefiniowanych nazw tych plików i ich zawartości. Np:
Kod
//dla czytelnośći dodałem tutaj spacje między nazwą pliku a pipe a zawartością. Normalnie ich nie ma
Plik 1 | Zawartość bla bla 1
Plik 2 | Zawwwwartość 222
Plik 1 | dodatkowa zawartość 1
Plik 3 | zaw 3


Zwróćcie uwagę, że Plik 1 powtórzył się dwa razy, więc jego zawartośc powinna wyglądać następująco:
Kod
Zawartość bla bla 1
dodatkowa zawartość 1


Niestety moje skrypciwo dodaje jedynie zawartość z ostatniego wystąpienia pary " 'nazwa pliku' | 'zawartość' " czyli Plik 1 będzie zawierał jedynie 'dodatkowa zawartość 1'.

Myślę, że najlepiej jest zmodyfikować tę linijkę: $zip->addFromString($file_name,$file_input); tak, aby nadpisując istniejący plik dodawało zawartość na jego końcu, od nowej lini. Jak to osiągnąć? Pomóżcie.


  1. $zip = new ZipArchive();
  2. $filename = "./pliczekzip.zip";
  3. unlink($filename);
  4.  
  5. if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
  6. exit("cannot open <$filename>\n");
  7. }
  8.  
  9. $cells='';
  10. $seperate_files=$cells_from_file;
  11. $file_input='';
  12.  
  13. foreach($seperate_files as $sf){
  14. $file_content_split=explode('|',$sf);
  15. $file_name=$file_content_split[0];
  16. $file_content=explode(',',$file_content_split[1]);
  17.  
  18. foreach($file_content as $fc){
  19. $cells=explode(' ',$fc);
  20.  
  21. $colls=$cells[0];
  22. $rows=$cells[1];
  23.  
  24. $file_input.=$xlsx_file_modified[$rows][$colls];
  25. $file_input.="\t";
  26. }
  27. $file_name='S'.$file_name_prefix.$file_name;
  28. $zip->addFromString($file_name,$file_input);
  29. $file_input='';
  30.  
  31. }
  32.  
  33.  
  34.  
  35.  
  36. echo '<u><h2><a href="pliczekzip.zip">Pobierz plik</a></h2></u>';
  37.  
  38.  
  39. $zip->close();
trueblue
A zmienna $xlsx_file_modified skąd się wzięła?
sadistic_son
A to jest tablica zawierająca treść. Dokładniej rzecz ujmując to $xlsx_file_modified[$rows][$colls] wyciąga dane z tablicy gdzie $rows oraz $colls odpowiada namiarom w tej tablicy wziętym z treści plików. Czyli:
Kod
Plik 1 | A50
Plik 2 | B100

Plik 1 ma zawierać w sobie to co siedzi w $xlsx_file_modified[50][A], a Plik 2 ma zawierać w sobie to co zostanie wzięte z $xlsx_file_modified[100][B].
gornik
a cosik takiego? Sprawdź czy zadziała, bo na szybko z manuala ogarnąłem.

  1. $file_name='S'.$file_name_prefix.$file_name;
  2.  
  3. if ($zip->locateName( $filename ) !== false)
  4. {
  5. $zip_file_input = $zip->getFromName( $filename );
  6. $file_input = $zip_file_input . PHP_EOL . $file_input;
  7. }
  8.  
  9. $zip->addFromString($file_name,$file_input);
sadistic_son
Znaczy masz na myśli żeby to:
  1. $file_name='S'.$file_name_prefix.$file_name;
  2. $zip->addFromString($file_name,$file_input);
  3. $file_input='';

zamienić na to?
  1. $file_name='S'.$file_name_prefix.$file_name;
  2.  
  3. if ($zip->locateName( $filename ) !== false)
  4. {
  5. $zip_file_input = $zip->getFromName( $filename );
  6. $file_input = $zip_file_input . PHP_EOL . $file_input;
  7. }
  8.  
  9. $zip->addFromString($file_name,$file_input);
  10. $file_input='';


Zrobiłem tak. Niestety jest bez zmian.
gornik
Dobra zrobiłem symulacje sobie. Problem polega na tym, że nie odświeża zawartość zipa. Trzeba przy każdej iteracji na nowo otworzyć zip. Nie wiem na ile to będzie jest wydajne w Twoim przypadku ale działa smile.gif
  1. <?php
  2.  
  3. $files = [];
  4. $files[] = ['name' => 'file1.txt', 'content' => 'main content for file 1'];
  5. $files[] = ['name' => 'file2.txt', 'content' => 'main content for file 2'];
  6. $files[] = ['name' => 'file1.txt', 'content' => 'aditional content for file 1'];
  7. $files[] = ['name' => 'file3.txt', 'content' => 'main content for file 3'];
  8.  
  9. $zip = new ZipArchive();
  10. $filename = "./pliczekzip.zip";
  11. unlink($filename);
  12.  
  13. foreach($files as $file){
  14. if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
  15. exit("cannot open <$filename>\n");
  16. }
  17. $file_input = $file['content'];
  18. $file_name = $file['name'];
  19.  
  20. if ($zip->locateName( $file_name ) !== false )
  21. {
  22.  
  23. $zip_file_input = $zip->getFromName( $file_name );
  24. $file_input = $zip_file_input . PHP_EOL . $file_input;
  25.  
  26. }
  27. $zip->addFromString($file_name,$file_input);
  28. }
  29.  
  30.  
  31. echo '<u><h2><a href="pliczekzip.zip">Pobierz plik</a></h2></u>';
  32.  
  33.  
  34. $zip->close();
sadistic_son
Wydajność nie ma aż takiego znaczenia, ważne że działa. Dzięki wielkie!
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.