$_FILES empty after form submission [duplicate]

2019-02-16 07:27发布

问题:

This question already has an answer here:

  • Why would $_FILES be empty when uploading files to PHP? 19 answers

I'm using standard PHP functions to upload a file for use as an attachment with PHPMailer.

<form name="upload" method="post" action="send_form_email3.php">
    <div width="100%" class="con3">
        <div class="lable">
            <label for="first_name">First Name *</label>
        </div>
        <input  type="text" name="first_name" id="first_name" class="span4">

        <div class="lable">
            <label for="email">Email Address *</label>
        </div>
        <input  type="text" name="email" id="email" class="span4">

        <div class="lable">
            <label for="telephone">Contact Number *</label>
        </div>
        <input  type="text" name="telephone" id="telephone" class="span4">

        <div class="lable">
            <label for="comments">Message *</label>
        </div>
        <textarea  name="comments" rows="8" id="comments" class="span4"></textarea>

        <div class="lable">
            <label for="upload">Send Us Your CV *</label>
        </div>
        <input type="file" name="upload" id="upload" />

        <input type="submit" value="Submit" class="btn btn-success">
    </div>
</form>

This form gets submitted to the following php handler where the mail is built and sent:

<?php

    require_once("class.phpmailer.php");

    $first_name = $_POST['first_name']; // required
    $email_from = $_POST['email']; // required
    $telephone = $_POST['telephone']; // required
    $comments = $_POST['comments']; // required

    echo "just got form values<br />";
    echo $_FILES['upload']['name'].'<br />';

    $email_message = "Form details below.<br />";

    function clean_string($string) {
      $bad = array("content-type","bcc:","to:","cc:","href");
      return str_replace($bad,"",$string);
    }

    $email_message .= "Name: ".clean_string($first_name)."\n";
    $email_message .= "Email: ".clean_string($email_from)."\n";
    $email_message .= "Contact: ".clean_string($telephone)."\n";
    $email_message .= "Message:\n".clean_string($comments)."\n";

    echo "added text to email<br />";

    $target_path = "uploads/";

    $target_path = $target_path . basename( $_FILES['upload']['name']); 

    // upload the file
    echo "target = ".$target_path."<br />";

    if (isset($_FILES['upload']['size']))
    {
        if ($_FILES['upload']['size'] > 0)
        {
        echo 'file size: '.basename($_FILES['upload']['size']).'<br />';
            if (move_uploaded_file($_FILES['upload']['name'], $target_path))
            {
                echo "The file ".  basename( $_FILES['upload']['name'])." has been uploaded<br />";
                                    // adding an already existing file as an attachment to the email for debugging purposes.
                $email->AddAttachment('uploads/CreditReportViewer.pdf');
            }
            else
            {
                echo "There was an error uploading the file, please try again!<br />&nbsp;".basename($_FILES['upload']['error']);
            }
        }
        else
        {
            echo "There was an error uploading the file, please try again!<br />";
        }
    }
    else
    {
        echo "No file was found for the upload.<br />";
    }


    $email = new PHPMailer();

    $email->To = "me@this.com";
    $email->From = $email_from;
    $email->FromName = $first_name;
    $email->Subject = "New Message from Website";
    $email->Body = $email_message;

    echo "\n mail built...<br />";

    $email->Send();

    echo "mail sent!";
?>

The problem is that $_FILES['upload']['name'] is not set. Here's the echoes that are being written to the browser:

just got form values

added text to email
target = uploads/
No file was found for the upload.
mail built...
mail sent!

This makes me think that I'm referencing the file upload field or the upload itself incorrectly.

Can anyone see any problems here or provide some guidance if this isn't the best way to do this?

回答1:

You have to add,

enctype= "multipart/form-data"

Change your form to,

<form name="upload" method="post" action="send_form_email3.php" enctype= "multipart/form-data">


回答2:

add enctype to your form: change:

<form name="upload" method="post" action="send_form_email3.php">

to

<form name="upload" method="post" action="send_form_email3.php" enctype="multipart/form-data">


回答3:

Another tip: if the upload_max_filesize (php.ini) is less than the file selected by user, $_FILES will be empty.



回答4:

You forget to set multipart in form declaration.

add enctype="multipart/form-data" in form.



回答5:

You should add enctype=multipart/form-data to your form.

<form name="upload" method="post" action="send_form_email3.php" enctype="multipart/form-data">

Because it's transmitted as a MIME stream, a very different format than a normal POST

What does enctype='multipart/form-data' mean?



回答6:

If you added the enctype and still doesn't work - check the PHP file permissions. in ooowebhost you can find it in chmod. change to '777'. otherwise, the file doesn't have permissions to execute/write