Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Kilka wygenerowanych obrazków w archiwum ZIP
Forum PHP.pl > Forum > PHP
KR2615
Witam
Przygotowałem właśnie ksiązeczkę opłat dla swoich abonentów. Stworzyłem do tego funkcję genrującą obraz z wypełnionym drukiem. Gdy umieszczam ją w liku, wszystko jest ok. Jeśli natomiast chciałbym ją wywołać 12 razy a wynik umieścić w pliku zip to i tak w przegladarce pojawia sie pierwszy plik a archiwum .zip posaida dwanaście pustych plików. Nie wiem, co robie nie tak. Oto fragment kodu:

  1. function maketemplate($month = 0) {
  2.  
  3. header("Content-type: image/jpeg");
  4. header('Content-Disposition: attachment; filename="'. $month. '.jpg"');
  5.  
  6. $image = imagecreatefromjpeg("druk.jpg");
  7. $black = imagecolorallocate($image, 0, 0, 0);
  8. $font = 'Lucida.ttf';
  9.  
  10. imagettftext($image, 16, 0, 150, 332, $black, $font, 'Nazwa firmy');
  11.  
  12. imagejpeg($image);
  13. imagedestroy($image);
  14. }


  1. $zip = new ZipArchive();
  2. if ($zip->open("/tmp/test.zip", ZIPARCHIVE::CREATE) !==TRUE) {
  3. exit ();
  4. }
  5. for($i=1; $i<12; $i++) {
  6. $zip->addFromString("$i.txt",maketemplate($i));
  7. }
  8. $zip->close();
mortus
Jak sam zauważyłeś Twoja funkcja maketemplate() wysyła wygenerowany obraz do przeglądarki lub zapisuje do pliku, a tymczasem powinna zwrócić jego "zawartość":
  1. function maketemplate($month = 0) {
  2. $image = imagecreatefromjpeg("druk.jpg");
  3. $black = imagecolorallocate($image, 0, 0, 0);
  4. $font = 'Lucida.ttf';
  5. imagettftext($image, 16, 0, 150, 332, $black, $font, 'Nazwa firmy');
  6. return $image;
  7. }

Tę zawartość możemy teraz w pętli zapisać do pliku (swoją drogą pętla powinna być do $i <= 12):
  1. $zip = new ZipArchive();
  2. if ($zip->open("/tmp/test.zip", ZIPARCHIVE::CREATE) !==TRUE) {
  3. exit ();
  4. }
  5. for($i=1; $i<=12; $i++) {
  6. $zip->addFromString("$i.jpg", maketemplate($i));
  7. }
  8. $zip->close();

Oczywiście możesz też najpierw wygenerować 12 plików, które później dodasz do archiwum (tutaj zamiast addFromString() użyjesz addFile()), ale trzeba pamiętać o ścieżkach do plików.
KR2615
Niestety po tej modyfikacji funkcja maketemplate(); nic nie zwraca a pętla wyrzuca błędy:
Warning: ZipArchive::addFromString() expects parameter 2 to be string, resource given in /var/www/druki.php
mortus
Funkcja maketemplate() jednak coś zwraca. Myślałem tylko, że będzie to obraz w postaci łańcucha znaków, a jest to zasób obrazu. Na szczęście można temu zaradzić:
  1. function maketemplate($month = 0) {
  2. $image = imagecreatefromjpeg("druk.jpg");
  3. $black = imagecolorallocate($image, 0, 0, 0);
  4. $font = 'Lucida.ttf';
  5. imagettftext($image, 16, 0, 150, 332, $black, $font, 'Nazwa firmy ');
  6. imagejpeg($image);
  7. $image = ob_get_contents();
  8. return $image;
  9. }
KR2615
Zmieniłem kod i w tym wypadku wygląda na to, że funkcja zwraca ciąg znaków. Po wywolaniu pliku .php w przegladarce pojawia się obraz w postaci ciągu znaków (tak się domyślam bo zawiera na początku CREATOR: gd-jpeg v1.0 (using IJG JPEG v62))
Kofel
Tak właśnie powinno być - wyświetla Ci obrazek w postaci ciągu znaków, bo przeglądarka nie dostała nagłówka z mimetype obrazka.
mortus
I ten ciąg znaków podajesz jako drugi argument metody addFromString() klasy do obsługi archiwów zip
  1. $zip = new ZipArchive();
  2. if($zip->open("/tmp/test.zip", ZIPARCHIVE::CREATE) !==TRUE) {
  3. exit ();
  4. }
  5. for($i = 1; $i <= 12; $i++) {
  6. $zip->addFromString("$i.jpg", maketemplate($i));
  7. }
  8. $zip->close();

Oczywiście plik zapisujesz jako $i.jpg, a nie $i.txt.
KR2615
Podałem wlasnie w argumencie ale zamiast w pliku test.zip wynik pojawił sie jako tekst w przeglądarce. W archiwum .zip są znów puste pliki. Chyba odpuszczę sobie to rozwiązanie i umieszcze linki do .jpg'ów
klocu
A takie pytanie z innej beczki.
Klientom przygotowujesz paczkę obrazków zapakowaną w zipową paczkę. Nie lepiej i szybciej byłoby wygenerować druczki przelewu po 2 na arkusz A4 przy użyciu choćby starego i wystarczającego do tego zadania TCPDF?

Miałbyś mniej operacji do wykonania, zapuścił pętlę wygenerowania X druczków, te szybciutko by się wygenerowały i byłyby gotowe do wysyłki.
A i klient mniej by kręcił nosem jakby dostał plik, który mu się otworzy w każdej przeglądarce internetowej, wypuści go na drukarkę i zapomni.
A przy obrazkach to jeszcze może dojść skalowanie i inne cuda, poczta może mieć obiekcje bo przeskalowane itd.
franki01
  1. function maketemplate($month = 0) {
  2.  
  3. header("Content-type: image/jpeg");
  4. header('Content-Disposition: attachment; filename="'. $month. '.jpg"');
  5.  
  6. $image = imagecreatefromjpeg("druk.jpg");
  7. $black = imagecolorallocate($image, 0, 0, 0);
  8. $font = 'Lucida.ttf';
  9.  
  10. imagettftext($image, 16, 0, 150, 332, $black, $font, 'Nazwa firmy');
  11.  
  12. imagejpeg($image);
  13. imagedestroy($image);
  14. }


  1. $file = "/tmp/test.zip";
  2. $zip = new ZipArchive();
  3. if ($zip->open($file, ZIPARCHIVE::CREATE) !==TRUE) {
  4. exit ();
  5. }
  6. for($i=1; $i<12; $i++) {
  7. maketemplate($i);
  8. $text = ob_get_clean();
  9. $zip->addFromString("$i.jpg", $text);
  10. }
  11. $zip->close();
  12.  
  13. header('Content-Description: File Transfer');
  14. header('Content-Type: application/octet-stream');
  15. header('Content-Disposition: attachment; filename='.basename($file));
  16. header('Content-Transfer-Encoding: binary');
  17. header('Expires: 0');
  18. header('Cache-Control: must-revalidate');
  19. header('Pragma: public');
  20. header('Content-Length: ' . filesize($file));
  21. flush();
  22. readfile($file);


Funkcja niezmieniona, tylko drugi kod.
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.