Avatar billede gedekid Nybegynder
14. november 2006 - 11:06 Der er 9 kommentarer og
1 løsning

Flere filesends

Hej eksperter,

jeg har et langt script til at udregne et areal og til sidst er der en almindelig mail formular hvor der er mulighed for at medsende et eller flere billeder... Hvordan får jeg i den følgende kode lavet sådan at den opretter variablerne for hver fil... Der skal jo selvfølgelig nok bruges foreach, men er ikke lige helt skrap til den dimmer endnu..

---------------------------------------
        $fil = $_FILES['fileatt']['name'];
       
        if(empty($fil)) {
            $body .= "$name har sendt disse oplysninger via udregningsformularen:\n\nNavn: $name\nAdresse: $address\nPost nr.: $zip\nBy: $city\nTelefon: $phone\nMobil:$mobile\nE-mail: $email\n\nog ønsker et tilbud på imprægnering af $totalareal m2 (Dette er det totale facadeareal minus areal på døre og vinduer)\n\nØnsket kontakt mulighed: $contactby\n\nBillede: Der er ikke vedhæftet et billede\n";
            $headers  = "From: <tilbud@facade-impraegnering.dk>\n";
           
            if (mail($to, $subject, $body, $headers)) {
              echo("<p>Dine oplysninger er nu sendt og vi vil kontakte dig for at give dig et uforpligtende tilbud.</p>");
        } else {
              echo("<p>Der er sket en fejl! Prøv igen!</p>");
        }
        exit;           
   
    } else {
       
          $boundary = uniqid("");
          $mimeType =  "application/unknown";
          $fil_var = fread(fopen($_FILES['fileatt']['tmp_name'], "r"), filesize($_FILES['fileatt']['tmp_name']));
          $fil_var = base64_encode($fil_var);
          $fil_var = chunk_split($fil_var);
 
        $body  = "\n--$boundary\n";
          $body .= "Content-type: text/plain; charset=iso-8859-1\n";
        $body .= "Content-transfer-encoding: 8bit\n\n";
        $body .= "$name har sendt disse oplysninger via udregningsformularen:\n\nNavn: $name\nAdresse: $address\nPost nr.: $zip\nBy: $city\nTelefon: $phone\nMobil: $mobile\nE-mail: $email\n\nog ønsker et tilbud på imprægnering af $totalareal m2 (Dette er det totale facadeareal minus areal på døre og vinduer)\n\nØnsket kontakt mulighed: $contactby\n\nBillede: Der er vedhæftet et billede\n";
        $body .= "--$boundary\n";
     
        $body .= "Content-type: $mimeType; name=".$fil."\n";
          $body .= "Content-disposition: attachment; filename=".$fil."\n";
          $body .= "Content-transfer-encoding: base64\n\n";
          $body .= $fil_var."\n\n";
          $body .= "--$boundary--";
 
        $headers  = "From: <tilbud@facade-impraegnering.dk>\n";
          $headers .= "Content-type: multipart/mixed; boundary=\"$boundary\"";

        if (mail($to, $subject, $body, $headers)) {
              echo("<p>Dine oplysninger er nu sendt og vi vil kontakte dig for at give dig et uforpligtende tilbud.</p>");
        } else {
              echo("<p>Der er sket en fejl! Prøv igen!</p>");
        }   
    }
--------------------------------------

som nu er kan den jo kunde sende én fil afsted, fra felter fileatt i formularen.. Det virker også 100% upåklageligt...

Men skal lige ha' den sidste service med...
Avatar billede kinderaeg Nybegynder
14. november 2006 - 13:21 #1
Jeg har ikke så meget erfaring inden for attachments til mails, men et bud ville være noget i den her retning:

$boundary = uniqid("");
$body  = "\n--$boundary\n";
$body .= "Content-type: text/plain; charset=iso-8859-1\n";
$body .= "Content-transfer-encoding: 8bit\n\n";
$body .= "$name har sendt disse oplysninger via udregningsformularen:\n\nNavn: $name\nAdresse: $address\nPost nr.: $zip\nBy: $city\nTelefon: $phone\nMobil: $mobile\nE-mail: $email\n\nog ønsker et tilbud på imprægnering af $totalareal m2 (Dette er det totale facadeareal minus areal på døre og vinduer)\n\nØnsket kontakt mulighed: $contactby\n\nBillede: Der er vedhæftet et billede\n";
$body .= "--$boundary\n";
foreach($_FILES['fileatt'] as $fobj) {
  $mimeType =  "application/unknown";
  $fil_var = fread(fopen($fobj['tmp_name'], "r"), filesize($fobj['tmp_name']));
  $fil_var = base64_encode($fil_var);
  $fil_var = chunk_split($fil_var);

  $body .= "Content-type: $mimeType; name=".$fobj['name']."\n";
  $body .= "Content-disposition: attachment; filename=".$fobj['name']."\n";
  $body .= "Content-transfer-encoding: base64\n\n";
  $body .= $fil_var."\n\n";
}
$body .= "--$boundary--";

$headers  = "From: <tilbud@facade-impraegnering.dk>\n";
$headers .= "Content-type: multipart/mixed; boundary=\"$boundary\"";
Avatar billede gedekid Nybegynder
14. november 2006 - 13:54 #2
Ser ud til at du skal være min redningsmand igen :)

Men jeg får den her fejl nu:

Warning: fopen() [function.fopen]: Unable to access h in /www/bygitegl.dk/web/sendmail.php on line 37

Warning: fopen(h) [function.fopen]: failed to open stream: No such file or directory in /www/bygitegl.dk/web/sendmail.php on line 37

Warning: filesize() [function.filesize]: stat failed for h in /www/bygitegl.dk/web/sendmail.php on line 37

Warning: fread(): supplied argument is not a valid stream resource in /www/bygitegl.dk/web/sendmail.php on line 37

Warning: fopen() [function.fopen]: Unable to access q in /www/bygitegl.dk/web/sendmail.php on line 37

Warning: fopen(q) [function.fopen]: failed to open stream: No such file or directory in /www/bygitegl.dk/web/sendmail.php on line 37

Warning: filesize() [function.filesize]: stat failed for q in /www/bygitegl.dk/web/sendmail.php on line 37

Warning: fread(): supplied argument is not a valid stream resource in /www/bygitegl.dk/web/sendmail.php on line 37

Dine oplysninger er nu sendt og vi vil kontakte dig for at give dig et uforpligtende tilbud.

koden til output af fil-felterne:

        for($p=1; $p <= 2; $p++) {
               
                    print "<tr>";
                        print "<td><b>Billede ". $p .":</b></td>";
                        print "<td><input type='file' name='fileatt[$p]' /></td>";                   
                    print "</tr>";               
                }
               
                $p++;
Avatar billede kinderaeg Nybegynder
14. november 2006 - 14:24 #3
Tjah, det lader til at $fobj['tmp_name'] indeholder henholdsvis værdien h og q, og det kan den jo naturligvis ikke åbne. Men hvis du før ikke havde noget problem med at udføre scriptet, synes jeg det virker underligt.

Prøv evt at skrive $fobj ud vha. print_r():

foreach($_FILES['fileatt'] as $fobj) {
  print_r($fobj);
}

Så skulle du kunne se, hvilke værdier der findes i $fobj, så kan du måske se hvad der er galt?!?
Avatar billede gedekid Nybegynder
14. november 2006 - 14:29 #4
Der får jeg den her:

Array ( [1] => ladiesnight_web.jpg [2] => house_4.jpg ) Array ( [1] => image/jpeg [2] => image/jpeg ) Array ( [1] => /tmp/php8TjYqw [2] => /tmp/phpDBQEmw ) Array ( [1] => 0 [2] => 0 ) Array ( [1] => 172695 [2] => 45977 )

Det er de 2 filer jeg smider i boksene.. Så den får da noget over...
Avatar billede kinderaeg Nybegynder
14. november 2006 - 15:02 #5
Ja pass, ved ikke lige hvorfor det ikke virker, men nedenstående skulle fungere.

foreach ($_FILES["fileatt"]["error"] as $key => $error) {
  if ($error == UPLOAD_ERR_OK) {
    $mimeType =  "application/unknown";
    $fil_var = fread(fopen($_FILES["fileatt"]["tmp_name"][$key], "r"), filesize($_FILES["fileatt"]["tmp_name"][$key]));
    $fil_var = base64_encode($fil_var);
    $fil_var = chunk_split($fil_var);
 
    $body .= "Content-type: $mimeType; name=".$_FILES["fileatt"]["name"][$key]."\n";
    $body .= "Content-disposition: attachment; filename=".$_FILES["fileatt"]["name"][$key]."\n";
    $body .= "Content-transfer-encoding: base64\n\n";
    $body .= $fil_var."\n\n";
  }
}
Avatar billede gedekid Nybegynder
14. november 2006 - 15:11 #6
That works :)
Jeg må bøje mig for mesteren :)
Mange tak.. Smid lige et svar..
Avatar billede gedekid Nybegynder
14. november 2006 - 15:42 #7
Ov.. Lige en ting mere... Jeg kan kun se den ene fil under attachments.. Men tjekker jeg mailens properties kan jeg se at alle filerne er sendt med.. Why is that ?
Avatar billede kinderaeg Nybegynder
14. november 2006 - 16:09 #8
Takker for de pæne ord, men jeg vil nu ikke kalde mig mester i noget som helst, men en god omgang trial & error er nu en god ting ;)

Ja pass, måske skal du sætte en boundry imellem hver enkelt fil, ved at sætte $body .= "--$boundary--"; inden for løkken.

foreach ($_FILES["fileatt"]["error"] as $key => $error) {
  if ($error == UPLOAD_ERR_OK) {
    $mimeType =  "application/unknown";
    $fil_var = fread(fopen($_FILES["fileatt"]["tmp_name"][$key], "r"), filesize($_FILES["fileatt"]["tmp_name"][$key]));
    $fil_var = base64_encode($fil_var);
    $fil_var = chunk_split($fil_var);
 
    $body .= "Content-type: $mimeType; name=".$_FILES["fileatt"]["name"][$key]."\n";
    $body .= "Content-disposition: attachment; filename=".$_FILES["fileatt"]["name"][$key]."\n";
    $body .= "Content-transfer-encoding: base64\n\n";
    $body .= $fil_var."\n\n";
    $body .= "--$boundary--";
  }
}
Avatar billede kinderaeg Nybegynder
14. november 2006 - 16:12 #9
Hov, svar i øvrigt, også ;)
Avatar billede gedekid Nybegynder
15. november 2006 - 08:39 #10
Mange takker for hjælpen og point til dig :)

Har sat en boundary for hver fil, men det sker der ikke rigtig noget jeg.. Men jeg prøver mig lige frem. Løsningen ligger garanteret lige for. :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester