简体   繁体   中英

ajax file cannot upload file in php email form

I have problem with the ajax file. The ajax file does not work with the php form. when I run the code it displays an error file_get_content error, file name empty.

The php code is working properly. but the ajax file cannot transfer the file field value. So the file cannot attach with mail.

it shows the error: file name empty

plz help me to pass the file field value through the ajax file.

<div>
<form  method="post" enctype="multipart/form-data" name="form1" id="form1"     action="contactus.php" onsubmit="xmlhttpPost('contactus.php', 'form1', 'Myresult', ''); return false;">
Name:<input name="name1" type="text"   value="" />
Address:<input name="address1" type="text"  value="" /> 
Phone:<input name="phone1" type="text" value=""/>
Email: <input name="email1" type="text" value="" />
File:<input name="file" type="file" size="35" id="file" />
Links:<input name="links1" type="text" value="" />
Subject:<input name="subject1" type="text" value="" />
Location:<select name="location">
              <option value="" selected="selected">--Select--</option>
              <option>1</option>
              <option>2</option>
              <option>3</option>
              <option>4</option>
              <option>5</option>
            </select>

Comments:<textarea name="comment1"  ></textarea>
<input name="submit" id="submit" type="submit"/>   
<div id="Myresult"></div>
</form>
</div>

php form(contactus.php)

<?php
if(isset($_POST['submit']))
{

 $name=$_POST['name1'];
$address=$_POST['address1'];
$phone=$_POST['phone1'];
$email=$_POST['email1'];
$subject=$_POST['subject1'];
$location=$_POST['location'];
$comment=$_POST['comment1'];
$links=$_POST['links1'];

$to='mail@mail.com';

 $message .= "\nName: ".$name."\n\n";
 $message .= "Address: ".$address."\n\n";
 $message .= "Phone: ".$phone."\n\n";
 $message .= "Email: ".$email."\n\n";
  $message .= "Links: ".$links."\n\n";
  $message .= "Location: ".$location."\n\n";
  $message .= "Comments:\n\n ".$comment."\n";



$attachment = chunk_split(base64_encode(file_get_contents($_FILES['file']['tmp_name'])));
    $filename = $_FILES['file']['name'];
    $filetype = $_FILES['file']['type'];        
    $boundary =md5(date('r', time())); 

$headers = "From: $name <$email>\r\nReply-To: $name <$email>";
$headers .= "\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"_1_$boundary\"";


$message="This is a multi-part message in MIME format.

  --_1_$boundary
 Content-Type: multipart/alternative; boundary=\"_2_$boundary\"

 --_2_$boundary
 Content-Type: text/plain; charset=\"iso-8859-1\"
 Content-Transfer-Encoding: 7bit

 $message

 --_2_$boundary--
 --_1_$boundary
 Content-Type: $filetype; name=\"$filename\" 
 Content-Transfer-Encoding: base64 
 Content-Disposition: attachment 

 $attachment

 --_1_$boundary--";

 mail($to,$subject,$message,$headers);

 print 'Thanks, your message sent!';

 }

 ?>

ajax.js

function xmlhttpPost(strURL,formname,responsediv,responsemsg) {

var xmlHttpReq = false;

var self = this;

// Xhr per Mozilla/Safari/Ie7

if (window.XMLHttpRequest) {

    self.xmlHttpReq = new XMLHttpRequest();

}

// per tutte le altre versioni di IE

else if (window.ActiveXObject) {

    self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");

}

self.xmlHttpReq.open('POST', strURL, true);

self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

self.xmlHttpReq.onreadystatechange = function() {

    if (self.xmlHttpReq.readyState == 4) {

        // Quando pronta, visualizzo la risposta del form

        updatepage(self.xmlHttpReq.responseText,responsediv);

    }

    else{

        // In attesa della risposta del form visualizzo il msg di attesa

        updatepage(responsemsg,responsediv);



    }

}

  self.xmlHttpReq.send(getquerystring(formname));

}



 function getquerystring(formname) {

 var form = document.forms[formname];

var qstr = "";



function GetElemValue(name, value) {

    qstr += (qstr.length > 0 ? "&" : "")

        + escape(name).replace(/\+/g, "%2B") + "="

        + escape(value ? value : "").replace(/\+/g, "%2B");

        //+ escape(value ? value : "").replace(/\n/g, "%0D");

}



var elemArray = form.elements;

for (var i = 0; i < elemArray.length; i++) {

    var element = elemArray[i];

    var elemType = element.type.toUpperCase();

    var elemName = element.name;

    if (elemName) {

        if (elemType == "TEXT"

                || elemType == "TEXTAREA"

                || elemType == "PASSWORD"

                || elemType == "BUTTON"

                || elemType == "RESET"

                || elemType == "SUBMIT"

                || elemType == "FILE"

                || elemType == "IMAGE"

                || elemType == "HIDDEN")

            GetElemValue(elemName, element.value);

        else if (elemType == "CHECKBOX" && element.checked)

            GetElemValue(elemName, 

                element.value ? element.value : "On");

        else if (elemType == "RADIO" && element.checked)

            GetElemValue(elemName, element.value);

        else if (elemType.indexOf("SELECT") != -1)

            for (var j = 0; j < element.options.length; j++) {

                var option = element.options[j];

                if (option.selected)

                    GetElemValue(elemName,

                        option.value ? option.value : option.text);

            }

    }

}

return qstr;

}

function updatepage(str,responsediv){


document.getElementById(responsediv).innerHTML = str;


}

problems:

1) Standard AJAX cannot upload files. The usual workaround is to build a form in a hidden <iframe> and perform a standard POST upload there.

2) Your code simply ASSUMES an upload has been performed AND succeeded. This is, frankly, stupid. NEVER assume success when dealing with users. Always prepare for the worst. Your code, at minimum, should have something like this:

if ($_FILES['fieldname']['error'] !== UPLOAD_ERR_OK) {
   die("File upload failed with error code " . $_FILES['fieldname']['error']);
}

if you'd had something like that, you'd have gotten (probably) error code #4 - no file uploaded, because uploads cannot be done via AJAX. The error codes are defined here: http://www.php.net/manual/en/features.file-upload.errors.php

3) You are building your own mime emails, which is not the easiest thing to get right. Why don't you try using Swiftmailer or PHPMailer? Both make sending a MIME email, with html, embedded attachments, etc... almost trivial. Virtually all of your MIME-building code would be reduced to a SINGLE line in either library.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM