$_FILES empty after form submission [duplicate]

2019-02-16 06:56发布

This question already has an answer here:

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?

6条回答
甜甜的少女心
2楼-- · 2019-02-16 07:18

You forget to set multipart in form declaration.

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

查看更多
冷血范
3楼-- · 2019-02-16 07:24

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

查看更多
劫难
4楼-- · 2019-02-16 07:27

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?

查看更多
啃猪蹄的小仙女
5楼-- · 2019-02-16 07:29

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

查看更多
该账号已被封号
6楼-- · 2019-02-16 07:30

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">
查看更多
叼着烟拽天下
7楼-- · 2019-02-16 07:33

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">
查看更多
登录 后发表回答