PHP validation med uppladdning av fil

Permalänk
Medlem

PHP validation med uppladdning av fil

God dag!

Jag försöker använda mitt php script för att skicka iväg ett email med form data och den uppladdade filen. Jag får felmeddelandet "Upload your file" när jag klickar på submit knappen.

Koden:

$error_fnamn = ''; $error_artistlink = ''; $error_email = ''; $error_enamn = ''; $error_downloadlinks = ''; $artistlink = ''; $downloadlinks = ''; $email = ''; $enamn = ''; $fnamn = ''; $data = ''; $streamlink = ''; $releasedate = ''; $error_data = ''; $formfield_steamlink = ''; ############################################################## // FELMEDDELANDEN PHP // visar felmeddelanden när du testar dina script ini_set('display_errors', 1); // visar alla felmeddelanden men INTE "E_NOTICE" (standardvärdet i php.ini) // error_reporting(E_ALL ^ E_NOTICE); // visar alla felmeddelanden // error_reporting(E_ALL); //stäng av eventuella felrapporter //error_reporting(0); ############################################################## // CSS-formatering av formulärfält om inget felmeddelande visas $formfield_fnamn = 'formfield'; $formfield_enamn = 'formfield'; $formfield_email = 'formfield'; $formfield_artistlink = 'formfield'; $formfield_streamlink = 'formfield'; $formfield_downloadlinks = 'formfield'; $formfield_releasedate = 'formfield'; $formfield_data = 'formfield'; // om submitknappen använts if(isset($_POST['submit'])){ // kontrollerar om magic_quotes_gpc är aktiverat if(get_magic_quotes_gpc()){ $email = stripslashes(trim($_POST["email"])); $fnamn = stripslashes(trim($_POST["artist"])); $enamn = stripslashes(trim($_POST["trackname"])); $artistlink = stripslashes(trim($_POST["artistlink"])); $streamlink = stripslashes(trim($_POST["streamlink"])); $downloadlinks = stripslashes(trim($_POST["downloadlinks"])); $releasedate = stripslashes(trim($_POST["releasedate"])); } else{ $email = $_POST["email"]; $fnamn = $_POST["artist"]; $enamn = $_POST["trackname"]; $artistlink = $_POST['artistlink']; $streamlink = $_POST['streamlink']; $downloadlinks = $_POST['downloadlinks']; $releasedate = $_POST['releasedate']; } ######################################################################## // FELMEDDELANDEN - kontrollerar om formulärfält i ifyllda // anger en variabel som lagrar felmeddelanden $errors = array(); // kontrollera om ett Förnamn angivits if (empty($fnamn)) { // felmeddelandet (array) $errors[] = 'Ange ditt <strong>förnamn</strong>.'; // formulärfältet $error_fnamn = '<span class="error_text">*</span>'; $formfield_fnamn = 'error_formfield'; } // kontrollera om ett Efternamn angivits if (empty($enamn)) { // felmeddelandet (array) $errors[] = 'Ange ditt <strong>efternamn</strong>.'; // formulärfältet $error_enamn = '<span class="error_text">*</span>'; $formfield_enamn = 'error_formfield'; } // kontrollera om en E-postadress angivits if (empty($email)) { // felmeddelandet (array) $errors[] = 'Ange din <strong>e-postadress</strong>.'; // formulärfältet $error_email = '<span class="error_text">*</span>'; $formfield_email = 'error_formfield'; } if (empty($artistlink)) { // felmeddelandet (array) $errors[] = 'Ange din <strong>artistlink</strong>.'; // formulärfältet $error_artistlink = '<span class="error_text">*</span>'; $formfield_artistlink = 'error_formfield'; } if (empty($downloadlinks)) { // felmeddelandet (array) $errors[] = 'Ange din <strong>downloadlinks</strong>.'; // formulärfältet $error_downloadlinks = '<span class="error_text">*</span>'; $formfield_downloadlinks = 'error_formfield'; } if (empty($data)) { // felmeddelandet (array) $errors[] = 'Upload your file.'; // formulärfältet $error_data = '<span class="error_text">*</span>'; $formfield_data = 'error_formfield'; } // kontrollera om E-postadress är korrekt $emailcheck = trim($_POST["email"]); if(!preg_match("/^[a-z0-9\å\ä\ö._-]+@[a-z0-9\å\ä\ö.-]+\.[a-z]{2,6}$/i", $emailcheck)) { // felmeddelandet (array) $errors[] = 'Du har angivit en felaktig <strong>e-postadress</strong>!'; // formulärfältet $error_email = '<span class="error_text">*</span>'; $formfield_email = 'error_formfield'; } // kontrollerar den (extra) maximala filstorleken foreach($_FILES as $userfile){ // sparar filinformation om temporärt filnamn, filtyp, filnamn och filstorlek $size = $userfile['size']; if ($size > $max_file_size ) { // felmeddelandet (array) $errors[] = '<strong>Filstorleken</strong> på en bifogad fil ('.$size.' byte) är större än tillåten storlek ('.$max_file_size.' byte). Välj en fil med mindre storlek!'; } } ######################################################################## // om felaktig information angivits visas felmeddelandet (array) if (count($errors)>0){ echo ' <div id="error">'; foreach($errors as $fel) echo $fel.'<br />'; echo '</div> '; } // formmail-scriptet anropas om inga felmeddelanden visas else { // hämtar datum, IP och tid $ip = $_SERVER["REMOTE_ADDR"]; $datum = date("Y-m-d"); $time_local = date('H:i'); ######################################################################## // meddelandets innehåll $mailmessage = "". " ------------------------------------------------ avsändare: ".$fnamn." ".$enamn." e-post: ".$email." artist links: ".$artistlink." stream links: ".$streamlink." download or purchase links: ".$downloadlinks." release date: ".$releasedate." datum: ".$datum." tid: ".$time_local." IP: ".$ip." "; ######################################################################## // lagrar informationen i HEADERS $multipart_info = "This is a multi-part message in MIME format.\nIf you are reading this, consider upgrading your e-mail client to a MIME-compatible client.\n"; $boundary = md5(uniqid(time())); $headers = "From: $email \r\n"; $headers .= 'MIME-Version: 1.0' ."\n"; $headers .= 'Content-Type: multipart/mixed; boundary="'.$boundary .'"' . "\n\n"; $headers .= $multipart_info . "\n"; // Infogar en gräns (boundary) $headers .= '--'.$boundary."\n"; // Kodning för textinnehåll $headers .= 'Content-Type: text/plain; charset=ISO-8859-1' ."\n"; $headers .= 'Content-Transfer-Encoding: 7bit'. "\n\n"; // Infogar meddelandets textinnehåll $headers .= $mailmessage . "\n"; // START slinga för att bifoga flera filer foreach($_FILES as $userfile){ // sparar filinformation om temporärt filnamn, filtyp, filnamn och filstorlek $tmp_name = $userfile['tmp_name']; $type = $userfile['type']; $name = $userfile['name']; $size = $userfile['size']; // kontrollerar att filen laddats upp if (file_exists($tmp_name)){ // kontrollerar att det är den uppladdade filen som lagrats i variabeln $tmp_name if(is_uploaded_file($tmp_name)){ // öppnar filen för att läsas binärt $file = fopen($tmp_name,'rb'); // hämtar filinnehållet till en variabel $data = fread($file, filesize($tmp_name)); // stänger filen fclose($file); // chunk_split — delar en sträng i mindre bitar för att sedan konvertaras till base64_encode // base64_encode - kodar innehållet med 7 bitars kod stället för 8 bitars kod // Används för att transportera data genom olika system där alla inte använder 8 bitars kod som tex olika mailklienter $data = chunk_split(base64_encode($data)); } // Infogar en gräns (boundary) $headers .= '--'.$boundary."\n"; $headers .= 'Content-Type: '.$type.'; name="'.$name.'"' ."\n"; // Anger kodning för den bifogade filen $headers .= 'Content-Transfer-Encoding: base64'. "\n"; // Anger att en bifogad fil finns $headers .= 'Content-Disposition: attachment; filename="'.$name.'"' ."\n\n"; // Infogar filen uppdelad i mindre bitar med chunk_split och base64_encode $headers .= $data. "\n\n"; } } // SLUT slinga för att bifoga flera filer // Infogar en gräns (boundary) //$headers .= '--'.$boundary."\n"; ######################################################################## // om meddelandefältet för avsändarens e-post inte är tomt skickas meddelandet if (!empty($_POST["email"])) { // Mailfunktionen som skickar meddelandet $send = mail($to, $subject, '', $headers); if ($send) { echo ' <div id="confirmation"> <h1>Tack '.$fnamn.'!</h1> <p>Ditt meddelande enligt nedan har skickats till oss. </p>'; // Om en fil bifogats visas namn och storlek på filen foreach($_FILES as $userfile){ if(!empty($userfile['name'])) { echo 'Bifogad fil: '.$userfile['name'].' ('.$userfile['size'].' byte)'; echo '<br />'; } } echo '</div>'; } else { echo "Det gick inte att skicka ditt meddelande. <br /> Gå tillbaka och prova igen!"; } } } } ob_end_flush(); if(!isset($_POST['submit']) || (count($errors)>0) ){ // FORMULÄR START echo ' <form action="" method="post" enctype="multipart/form-data" name="kontaktform" id="kontaktform"> <fieldset style="width: 500px;"> <legend>Submit your track!</legend><br /> <label for="artist">'.$error_fnamn.'Artist Name:</label><br /> <input name="artist" type="text" class="'.$formfield_fnamn.'" id="artist" size="30" value="'.$fnamn.'" /><br /> <label for="trackname">'.$error_enamn.'Track Name:</label><br /> <input name="trackname" type="text" class="'.$formfield_enamn.'" id="trackname" size="40" value="'.$enamn.'" /><br /> <label for="email">'.$error_email.'E-mail:</label><br /> <input name="email" type="text" class="'.$formfield_email.'" id="artistlink" size="40" value="'.$email.'" /><br /> <label for="artistlink">'.$error_artistlink.'Artist Link:</label><br /> <input name="artistlink" type="text" class="'.$formfield_artistlink.'" id="artistlink" size="40" value="'.$artistlink.'" /><br /> <label for="streamlink">Stream Link (if applicable):</label><br /> <input name="streamlink" type="text" class="'.$formfield_streamlink.'" id="streamlink" size="40" value="'.$streamlink.'" /><br /> <label for="releasaedate">Release Date (if applicable):</label><br /> <input name="releasedate" type="text" class="'.$formfield_releasedate.'" id="releasedate" size="40" value="'.$releasedate.'" /><br /> <label for="downloadlinks">'.$error_downloadlinks.'Purchase or Download Links:</label><br /> <textarea name="downloadlinks" id="downloadlinks" style="width: 450px; height: 50px; padding: 5px;" class="'.$formfield_downloadlinks.'" ">'.$downloadlinks.'</textarea><br /> <br /> <label for="filenamn">'.$error_data.'Bild eller fil som ska bifogas meddelandet:</label><br /> <input type="file" name="filename1"'.$formfield_data.'" id="filename1" size="60"'.$data.'" /><br /> </label>

Någon som vet var felet kan vara?

Permalänk
Inaktiv

Du laddar felmeddelandet till $data innan du laddar $data? Väldigt knasigt strukturerad logik

Permalänk
Medlem

Variabeln $data är ju alltid tom när raden

if (empty($data))

exekuteras. För övrigt snälla omslut din PHP kod med [ PHP ].

Permalänk
Medlem
Skrivet av yakideo:

Variabeln $data är ju alltid tom när raden

if (empty($data))

exekuteras. För övrigt snälla omslut din PHP kod med [ PHP ].

Nu har jag ändrat till php kod, ursäkta

Har du någon aning hur jag ska gå tillväga då så man kan köra en validation på $data också? T.ex. vilket värde ska jag sätta på

$data

för att kunna få det att fungera?

Permalänk
Medlem
Skrivet av Adam.E:

Nu har jag ändrat till php kod, ursäkta

Har du någon aning hur jag ska gå tillväga då så man kan köra en validation på $data också?

Hur ser ditt HTML formulär ut?

Permalänk
Medlem
Skrivet av yakideo:

Hur ser ditt HTML formulär ut?

if(!isset($_POST['submit']) || (count($errors)>0) ){ // FORMULÄR START echo ' <form action="" method="post" enctype="multipart/form-data" name="kontaktform" id="kontaktform"> <fieldset style="width: 500px;"> <legend>Submit your track!</legend><br /> <label for="artist">'.$error_fnamn.'Artist Name:</label><br /> <input name="artist" type="text" class="'.$formfield_fnamn.'" id="artist" size="30" value="'.$fnamn.'" /><br /> <label for="trackname">'.$error_enamn.'Track Name:</label><br /> <input name="trackname" type="text" class="'.$formfield_enamn.'" id="trackname" size="40" value="'.$enamn.'" /><br /> <label for="email">'.$error_email.'E-mail:</label><br /> <input name="email" type="text" class="'.$formfield_email.'" id="artistlink" size="40" value="'.$email.'" /><br /> <label for="artistlink">'.$error_artistlink.'Artist Link:</label><br /> <input name="artistlink" type="text" class="'.$formfield_artistlink.'" id="artistlink" size="40" value="'.$artistlink.'" /><br /> <label for="streamlink">Stream Link (if applicable):</label><br /> <input name="streamlink" type="text" class="'.$formfield_streamlink.'" id="streamlink" size="40" value="'.$streamlink.'" /><br /> <label for="releasaedate">Release Date (if applicable):</label><br /> <input name="releasedate" type="text" class="'.$formfield_releasedate.'" id="releasedate" size="40" value="'.$releasedate.'" /><br /> <label for="downloadlinks">'.$error_downloadlinks.'Purchase or Download Links:</label><br /> <textarea name="downloadlinks" id="downloadlinks" style="width: 450px; height: 50px; padding: 5px;" class="'.$formfield_downloadlinks.'" ">'.$downloadlinks.'</textarea><br /> <br /> <label for="filenamn">'.$error_data.'Bild eller fil som ska bifogas meddelandet:</label><br /> <input type="file" name="filename1"'.$formfield_data.'" id="filename1" size="60"'.$data.'" /><br /> </label> <br /> <input type="submit" name="submit" id="submit" value="Skicka meddelandet" /> <input type="reset" name="reset" id="reset" value="Rensa" /> </fieldset> </form>'; // FORMULÄR SLUT }

Permalänk
Medlem

1. Din input type="file" är inte korrekt.
2. Vad ska variabeln $data innehålla? Du sätter den till empty men sedan tillsätter du inget värde. Inte undra på att din if empty sats körs. Det finns inget att validera i $data då den är tom.

Permalänk
Medlem
Skrivet av yakideo:

1. Din input type="file" är inte korrekt.
2. Vad ska variabeln $data innehålla? Du sätter den till empty men sedan tillsätter du inget värde. Inte undra på att din if empty sats körs. Det finns inget att validera i $data då den är tom.

$data

Ska innehålla uppladdnings filen, för saken är...ifall om jag tar bort denna if-satsen:

if (empty($data)) { // felmeddelandet (array) $errors[] = 'Upload your file.'; // formulärfältet $error_data = '<span class="error_text">*</span>'; $formfield_data = 'error_formfield'; }

och fortfarande har

$data = '';

så skickar den iväg allting (till och med uppladdnings filen) och får inget felmeddlande.

Dock kan den inte validera ifall om man väljer en fil eller inte.

Permalänk
Medlem

Eftersom du inte förstår logiken i koden tror jag inte du har skrivit allt själv. Jag rekommenderar att du lär dig grunderna innan du börjar klippa och klistra.

Som jag skrev tidigare, $data innehåller inte den uppladdade filen och så länge du inte läser in något i den variabel förblir den tom.