Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Kilka wygenerowanych obrazków w archiwum ZIP
KR2615
post 20.03.2013, 15:39:53
Post #1





Grupa: Zarejestrowani
Postów: 311
Pomógł: 13
Dołączył: 7.05.2007

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


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


--------------------
Go to the top of the page
+Quote Post
mortus
post 20.03.2013, 16:47:56
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
KR2615
post 20.03.2013, 17:15:04
Post #3





Grupa: Zarejestrowani
Postów: 311
Pomógł: 13
Dołączył: 7.05.2007

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


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


--------------------
Go to the top of the page
+Quote Post
mortus
post 20.03.2013, 20:46:50
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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. }
Go to the top of the page
+Quote Post
KR2615
post 21.03.2013, 08:18:38
Post #5





Grupa: Zarejestrowani
Postów: 311
Pomógł: 13
Dołączył: 7.05.2007

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


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


--------------------
Go to the top of the page
+Quote Post
Kofel
post 21.03.2013, 11:18:23
Post #6





Grupa: Zarejestrowani
Postów: 99
Pomógł: 22
Dołączył: 14.12.2007
Skąd: Wyszków

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


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.
Go to the top of the page
+Quote Post
mortus
post 21.03.2013, 11:24:21
Post #7





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
KR2615
post 21.03.2013, 12:37:00
Post #8





Grupa: Zarejestrowani
Postów: 311
Pomógł: 13
Dołączył: 7.05.2007

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


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


--------------------
Go to the top of the page
+Quote Post
klocu
post 21.03.2013, 13:07:18
Post #9





Grupa: Zarejestrowani
Postów: 291
Pomógł: 45
Dołączył: 21.08.2007

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


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.
Go to the top of the page
+Quote Post
franki01
post 21.03.2013, 19:32:23
Post #10





Grupa: Zarejestrowani
Postów: 508
Pomógł: 75
Dołączył: 2.11.2005
Skąd: Bydgoszcz

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


  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.

Ten post edytował franki01 21.03.2013, 19:34:20
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: 26.06.2025 - 16:31