Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]phpmailer + skalowanie załacznika
Forum PHP.pl > Forum > Przedszkole
fcppl
witam,

Stworzyłem za pomocą phpmailer prosty formularz z możliwością dodania załącznika. Wszystko mi działa OK.

Chce dorobić żeby podczas dołączenia zdjęcia został podczas wysyłania automatycznie skalowany do ustalonego rozmiaru (pomniejszony) - zdjęcia pomniejszone będą wysłane na mój e-mail.
Teraz mam problem bo ludzi wysyłają b.duże zdjęcia i nie dość ze rozmiar jest duży to jeszcze zajmują po kilka MB.

Szukałem na forum jednak potrzebuję pomocy.

moj kod:

  1. <?php
  2.  
  3. if (isset($_POST["submit"])) {
  4.  
  5. $plik_tmp = $_FILES['plik']['tmp_name'];
  6. $plik = $_FILES['plik']['name'];
  7.  
  8. $name = strip_tags($_POST['name']);
  9. $address = strip_tags($_POST['address']);
  10. $email = strip_tags($_POST['email']);
  11. $message = strip_tags($_POST['message']);
  12.  
  13. require("phpmailer/class.phpmailer.php");
  14. $mail = new PHPMailer();
  15. $mail->PluginDir = "phpmailer/";
  16. $mail->From = 'xxx';
  17. $mail->FromName = 'test';
  18. $mail->Host = "smtp.wp.pl";
  19. $mail->Mailer = "smtp.wp.pl";
  20. $mail->Username = "xxx";
  21. $mail->Password = "xxx";
  22. $mail->SMTPAuth = true;
  23. $mail->SetLanguage("pl", "phpmailer/language/");
  24. $mail->Subject = 'test;
  25. $mail->CharSet = 'utf-8';
  26. $mail->IsHTML(true);
  27. $mail->Body = 'wiadomość z załącznikiem';
  28. $mail->AddAddress("test@test.pl");
  29. $mail->AddAttachment($plik_tmp, $plik);
  30. $mail->MsgHTML("
  31. <p>Adres: <strong>$name</strong> </p>
  32. <p>Osoba: <strong>$address</strong> </p>
  33. <p>Adres e-mail: <strong>$email</strong> </p>
  34. <p>tresc: <strong>$message</strong> </p>
  35. ");
  36. if (!$mail->Send())
  37. {
  38. echo '<p>Wystąpił błąd! Nie wysłano reklamacji.</p>';
  39. } else {
  40. $mail->ClearAddresses();
  41. $mail->ClearAttachments();
  42. echo '<p>Wiadomość została wysłana poprawnie.</p>';
  43. }
  44. }
  45. ?>
nospor
No ale z czym problem? W kodzie co podales nigdzie nie ma kodu odpowiedzialnego za zmniejszanie zdjecia.... W necie masz pelno kodow php do robienia miniatur.
fcppl
problem mam taki ze miniaturke mi robi i zapisuje na serwerze, ale na meila wysyła originalne duze zdjecie.

uzylem ten kod"

  1. $plik_tmp = $_FILES['image']['tmp_name'];
  2. $plik_nazwa = $_FILES['image']['name'];
  3.  
  4. $save_file = $plik_nazwa;
  5.  
  6.  
  7. if(is_uploaded_file($plik_tmp)) {
  8. move_uploaded_file($plik_tmp, ''.$save_file.'');
  9. echo "wszystko poszlo ok";
  10.  
  11.  
  12.  
  13. $img = imagecreatefromjpeg(''.$save_file.'');
  14.  
  15. $width = imagesx($img);
  16. $height = imagesy($img);
  17.  
  18.  
  19. $width_mini = 250; // szerokosc obrazka
  20. $height_mini = 170; // wysokosc obrazka
  21. $img_mini = imagecreatetruecolor($width_mini, $height_mini);
  22.  
  23.  
  24. imagecopyresampled($img_mini, $img, 0, 0, 0, 0, $width_mini , $height_mini, $width , $height);
  25.  
  26.  
  27. imagejpeg($img_mini, "min-".$save_file."", 80); // utworzona miniaturka liczba (80) oznacza jakos obrazka od 0 do 100
  28. imagedestroy($img);
  29. imagedestroy($img_mini);
  30.  
  31. }
nospor
Cytat
problem mam taki ze miniaturke mi robi i zapisuje na serwerze, ale na meila wysyła originalne duze zdjecie.
To tak ciezko bylo od razu to napisac??

Skoro miniaturke zapisujesz o tu:
imagejpeg($img_mini, "min-".$save_file."", 80);
czyli pod nazwą: "min-".$save_file.""
no to masz wlasnie ją załączac a nie uplodowany plik. W czym problem?
fcppl
dzięki za wskazówki.

Działa mi już prawie wszystko OK, ale nie potrafię zrobić żeby skalować jednocześnie dwa pliki. Kombinuje, ale efektów brak.

Taki mam kod do skalowania jednego pliku:

  1. <?php
  2.  
  3. if (isset($_POST["submit"])) {
  4. $plik_tmp = $_FILES['plik']['tmp_name'];
  5. $plik_nazwa = $_FILES['plik']['name'];
  6.  
  7.  
  8. $save_file = $plik_nazwa;
  9. if(is_uploaded_file($plik_tmp)) {
  10. move_uploaded_file($plik_tmp, ''.$save_file.'');
  11. $img = imagecreatefromjpeg(''.$save_file.'');
  12. $width = imagesx($img);
  13. $height = imagesy($img);
  14. $width_mini = 1024;
  15. $height_mini = 768;
  16. $img_mini = imagecreatetruecolor($width_mini, $height_mini);
  17. imagecopyresampled($img_mini, $img, 0, 0, 0, 0, $width_mini , $height_mini, $width , $height);
  18. imagejpeg($img_mini, $save_file."", 80);
  19. imagedestroy($img);
  20. imagedestroy($img_mini);
  21. }
  22.  
  23.  
  24. $name = strip_tags($_POST['name']);
  25. $address = strip_tags($_POST['address']);
  26. $email = strip_tags($_POST['email']);
  27. $message = strip_tags($_POST['message']);
  28.  
  29.  
  30. require("phpmailer/class.phpmailer.php");
  31. $mail = new PHPMailer();
  32. $mail->PluginDir = "phpmailer/";
  33. $mail->From = 'xxx';
  34. $mail->FromName = 'test';
  35. $mail->Host = "xxx";
  36. $mail->Mailer = "xxx";
  37. $mail->Username = "xxx";
  38. $mail->Password = "xxx";
  39. $mail->SMTPAuth = true;
  40. $mail->SetLanguage("pl", "phpmailer/language/");
  41. $mail->Subject = 'xxx';
  42. $mail->CharSet = 'utf-8';
  43. $mail->IsHTML(true);
  44. $mail->Body = 'xxx';
  45. $mail->AddAddress("xxx");
  46. $mail->AddAttachment($save_file);
  47.  
  48. $mail->MsgHTML("
  49. <p>Adres: <strong>$name</strong> </p>
  50. <p>Osoba: <strong>$address</strong> </p>
  51. <p>Adres e-mail: <strong>$email</strong> </p>
  52. <p>Opis: <strong>$message</strong> </p>
  53. ");
  54. if (!$mail->Send())
  55. {
  56. echo '<p>Wystąpił błąd! Nie wysłano reklamacji.</p>';
  57. } else {
  58. $mail->ClearAddresses();
  59. $mail->ClearAttachments();
  60. echo '<p>Wiadomosc została wysłana poprawnie.</p>';
  61. }
  62.  
  63. }
  64. ?>


Zrobiłem w form drugie pole "<input type="file" name="plik1" />" próbowałem dodać do php, ale w załączniku wysyła tylko pierwszy jpg. Problem mam z przerobieniem skryptu od skalowania, bo bez tego działają mi normalnie dwa lub więcej załączników.
nospor
POkaz kod jak dodajesz oba pola i je przetwarzasz. SKad mamy wiedziec gdzie robisz blad?
fcppl
Generalnie chyba mam wszystko źle bo nie potrafię przerobić kody od skalowania żeby działało na dwa załączniki.
Z tego kodu poniżej mimo, że w form wybiorę inne jpg zapisuje mi dwa pliki na serwerze jednak są one jednakowe i na meila tez mam dwa załączniki, ale takie same.

  1. <?php
  2.  
  3. if (isset($_POST["submit"])) {
  4. $plik_tmp = $_FILES['plik']['tmp_name'];
  5. $plik_nazwa = $_FILES['plik']['name'];
  6. $plik_nazwa1 = $_FILES['plik1']['name'];
  7.  
  8. $save_file = $plik_nazwa;
  9. $save_file1 = $plik_nazwa1;
  10.  
  11. if(is_uploaded_file($plik_tmp)) {
  12. move_uploaded_file($plik_tmp, ''.$save_file.'');
  13. move_uploaded_file($plik_tmp, ''.$save_file1.'');
  14. $img = imagecreatefromjpeg(''.$save_file.'');
  15. $width = imagesx($img);
  16. $height = imagesy($img);
  17. $width_mini = 100;
  18. $height_mini = 100;
  19. $img_mini = imagecreatetruecolor($width_mini, $height_mini);
  20. imagecopyresampled($img_mini, $img, 0, 0, 0, 0, $width_mini , $height_mini, $width , $height);
  21. imagejpeg($img_mini, $save_file."", 80);
  22. imagejpeg($img_mini, $save_file1."", 180);
  23. imagedestroy($img);
  24. imagedestroy($img_mini);
  25. }
  26.  
  27.  
  28. $name = strip_tags($_POST['name']);
  29. $address = strip_tags($_POST['address']);
  30. $email = strip_tags($_POST['email']);
  31. $message = strip_tags($_POST['message']);
  32.  
  33.  
  34. require("phpmailer/class.phpmailer.php");
  35. $mail = new PHPMailer();
  36. $mail->PluginDir = "phpmailer/";
  37. $mail->From = 'xxx';
  38. $mail->FromName = 'test';
  39. $mail->Host = "xxx";
  40. $mail->Mailer = "xxx";
  41. $mail->Username = "xxx";
  42. $mail->Password = "xxx";
  43. $mail->SMTPAuth = true;
  44. $mail->Subject = "test";
  45. $mail->CharSet = 'utf-8';
  46. $mail->IsHTML(true);
  47. $mail->Body = 'xxx';
  48. $mail->AddAddress("xxx");
  49. $mail->AddAttachment($save_file);
  50. $mail->AddAttachment($save_file1);
  51. $mail->MsgHTML("
  52. <p>Adres doręczenia: <strong>$name</strong> </p>
  53. <p>Osoba do kontaktu: <strong>$address</strong> </p>
  54. <p>Adres e-mail: <strong>$email</strong> </p>
  55. <p>Dokładny opis uszkodzenia: <strong>$message</strong> </p>
  56. ");
  57. if (!$mail->Send())
  58. {
  59. echo '<p>Wystąpił błąd! Nie wysłano.</p>';
  60. } else {
  61. $mail->ClearAddresses();
  62. $mail->ClearAttachments();
  63. echo '<p>Tresc została wysłana poprawnie.</p>';
  64. }
  65.  
  66. }
  67. ?>
Turson
No no skalować musisz każdy załącznik w pętli
nospor
move_uploaded_file($plik_tmp, ''.$save_file.'');
move_uploaded_file($plik_tmp, ''.$save_file1.'');
Przeciez o tu, przenosisz ten sam plik pod dwie rozne lokalizacje...
fcppl
Ostatnie pytanie. Wszystkie wcześniejsze "usterki" już rozwiązałem

Zmieniłem skrypt do skalowania na IMagick (kod poniżej). Wszystko mi działa idealnie, ale mam taki problem. Jeżeli nie wybiorę zdjęcia w formularzu wtedy cały skrypt się wysypuje. Spowodowane jest to tym ze brakuje img i skrypt zgłasza błąd.

Mnie interesuje jak zrobić żeby w momencie jak ktoś nie załączy fotki skrypt normalnie działał i pominął ta cześć kodu która jest odpowiedzialna za skalowanie.



  1. <?php
  2. if (isset($_POST["submit"])) {
  3. $plik_tmp = $_FILES['plik']['tmp_name'];
  4. $plik_nazwa = $_FILES['plik']['name'];
  5.  
  6.  
  7. $path=$plik_tmp;
  8. $photo=new Imagick($path);
  9. $photo->ThumbnailImage(1024,749,true);
  10. $photo->setImageCompressionQuality(10);
  11. $new_path=$_SERVER['DOCUMENT_ROOT'] . $plik_nazwa;
  12. $photo->writeImage($plik_nazwa);
  13.  
  14.  
  15.  
  16. $name = strip_tags($_POST['name']);
  17. $address = strip_tags($_POST['address']);
  18. $email = strip_tags($_POST['email']);
  19. $message = strip_tags($_POST['message']);
  20.  
  21. require("phpmailer/class.phpmailer.php");
  22. $mail = new PHPMailer();
  23. $mail->PluginDir = "phpmailer/";
  24. $mail->From = 'xxx';
  25. $mail->FromName = 'test';
  26. $mail->Host = "xxx";
  27. $mail->Mailer = "xxx";
  28. $mail->Username = "xxx";
  29. $mail->Password = "xxx";
  30. $mail->SMTPAuth = true;
  31. $mail->SetLanguage("pl", "phpmailer/language/");
  32. $mail->Subject = 'xxx';
  33. $mail->CharSet = 'utf-8';
  34. $mail->IsHTML(true); /
  35. $mail->Body = 'wiadomość';
  36. $mail->AddAddress("xxx");
  37. $mail->AddAttachment($plik_nazwa);
  38. $mail->MsgHTML("
  39. <p>Adres:<strong>$name</strong> </p>
  40. <p>Osoba:<strong>$address</strong> </p>
  41. <p>Adres<strong>$email</strong> </p>
  42. <p>Dokładny<strong>$message</strong> </p>
  43. ");
  44. if (!$mail->Send())
  45. {
  46. echo '<p>Wystąpił błąd! Nie wysłano.</p>';
  47. } else {
  48. $mail->ClearAddresses();
  49. $mail->ClearAttachments();
  50. echo '<p>Wiadomosc została wysłana poprawnie.</p>';
  51. }
  52. }
  53. ?>
Turson
  1. if(!empty($_FILES['plik']['tmp_name'])){
  2. $plik_tmp = $_FILES['plik']['tmp_name'];
  3. $plik_nazwa = $_FILES['plik']['name'];
  4.  
  5.  
  6. $path=$plik_tmp;
  7. $photo=new Imagick($path);
  8. $photo->ThumbnailImage(1024,749,true);
  9. $photo->setImageCompressionQuality(10);
  10. $new_path=$_SERVER['DOCUMENT_ROOT'] . $plik_nazwa;
  11. $photo->writeImage($plik_nazwa);
  12. }

z AddAttachment tak samo
fcppl
wszystko działa idealnie. dzięki za pomoc.
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.