Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Zapis do ZIP
sadistic_son
post 7.10.2021, 12:40:04
Post #1





Grupa: Zarejestrowani
Postów: 1 467
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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();


Ten post edytował sadistic_son 7.10.2021, 12:46:19


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
trueblue
post 7.10.2021, 12:49:31
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A zmienna $xlsx_file_modified skąd się wzięła?


--------------------
Go to the top of the page
+Quote Post
sadistic_son
post 7.10.2021, 12:52:46
Post #3





Grupa: Zarejestrowani
Postów: 1 467
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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].

Ten post edytował sadistic_son 7.10.2021, 12:58:38


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
gornik
post 7.10.2021, 12:59:33
Post #4





Grupa: Zarejestrowani
Postów: 56
Pomógł: 9
Dołączył: 28.04.2010

Ostrzeżenie: (0%)
-----


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


--------------------
Zwiedzam świat i koduje.
Ubrania podróżnicze | Blog podróżniczy
Go to the top of the page
+Quote Post
sadistic_son
post 7.10.2021, 13:09:40
Post #5





Grupa: Zarejestrowani
Postów: 1 467
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.

Ten post edytował sadistic_son 7.10.2021, 13:10:23


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post
gornik
post 7.10.2021, 13:28:08
Post #6





Grupa: Zarejestrowani
Postów: 56
Pomógł: 9
Dołączył: 28.04.2010

Ostrzeżenie: (0%)
-----


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();


--------------------
Zwiedzam świat i koduje.
Ubrania podróżnicze | Blog podróżniczy
Go to the top of the page
+Quote Post
sadistic_son
post 7.10.2021, 15:03:44
Post #7





Grupa: Zarejestrowani
Postów: 1 467
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Wydajność nie ma aż takiego znaczenia, ważne że działa. Dzięki wielkie!


--------------------
Uśpieni przez system, wychowani przez media,
Karmieni zmysłami, próżnymi żądzami...

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Jesteś zbyt leniwy, żeby się zarejestrować? Ja jestem zbyt leniwy aby Ci pomóc!
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 15:39