PHP文件上传问题

时间:2012-03-30 00:33:00

标签: php

我正在制作一个包含文件上传的邮件邮件,但文件根本没有显示在测试电子邮件中。我已经调整并重新调整但无济于事。有什么建议吗?

表格的HTMl部分如下所示

<div class="contactleft">


        <form action="former.php" method="post" enctype="multipart/form-data" id="former">

        <div class="textbox"><span id="sprytextfield1">
          <label for="fname"></label>
          <input name="fname" type="text" class="inputer" id="fname" />
          <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox -->
        <div class="textbox"><span id="sprytextfield2">
          <label for="lname"></label>
          <input name="lname" type="text" class="inputer" id="lname" />
          <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox -->
        <div class="textbox"><span id="sprytextfield3">
          <label for="email"></label>
          <input name="email" type="text" class="inputer" id="email" />
          <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox -->
        <div class="textbox"><span id="sprytextfield4">
          <label for="file"></label>
          <label for="file"></label>
          <label for="fileField"></label>
          <input type="file" name="fileField" id="fileField" />
          <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox -->


        <div class="textbox">
          <label for="sender"></label>
          <input type="submit" name="sender" id="sender" value="click to send message" />
        </div><!-- End TextBox -->

          </form>

     </div>

,邮件如下所示

   <?
   $mailto = 'info@siteripe.com'; // insert the email address you want the form sent to
    //$returnpage = 'thanks.php'; // insert the name of the page/location you want the user to be returned to//
    $sitename = '[siteripe.com]'; // insert the site name here, it will appear in the subject of your email

/* Do not edit below this line unless you know what you're doing */

  $fname = $_POST['fname'];
  $lname = $_POST['lname'];
  $email = $_POST['email'] ;
   $file = $_POST['file'];
   $subject = $_POST['subject'];


    if (!eregi("^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]{2,4}", $email)){
    print("<strong>Error:</strong> this email address is not in a valid format.<br/><br/><a href='javascript:history.go(-1)'>Back</a>");
         exit;
    }   

  $message = "\n$name submitted the following message:\n\n$message\n\n$name's contact details are as follows:\n\nFirst Name: $fname\nLast Name: $lname\nEmail Address: $email\nForm: $file";

  mail($mailto, "$subject", $message, "From: $email");

?> 

4 个答案:

答案 0 :(得分:1)

您不能只将$ file作为$ message的一部分传递而不添加一些额外的标题,表明该电子邮件是一个“多部分”电子邮件,并附带$ file作为附件。

如果你想使用vanilla PHP,请查看docs的mail()函数,有一些评论可以告诉你如何做你想要的。

如果您愿意查看第三方库,我建议使用Zend Framework,他们有一个Zend_Mail_Attachment类,它提供了一个干净的界面,用于发送带附件的电子邮件。

答案 1 :(得分:0)

尝试更改:

$file = $_POST['file'];

为:

$file = $_POST['fileField'];

答案 2 :(得分:0)

这应该有效:

    <html>
    <head>
        <title>Test</title>
    </head>
    <body>
<?
if(count($_POST) > 0){
   $mailto = 'info@siteripe.com'; // insert the email address you want the form sent to
    //$returnpage = 'thanks.php'; // insert the name of the page/location you want the user to be returned to//
    $sitename = '[siteripe.com]'; // insert the site name here, it will appear in the subject of your email

/* Do not edit below this line unless you know what you're doing */

  $fname = $_POST['fname'];
  $lname = $_POST['lname'];
  $name = $lname . ', ' . $fname;
  $email = $_POST['email'] ;
   $subject = (array_key_exists('subject', $_POST))?$_POST['subject']:'Default subject';


    if (!@eregi("^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]{2,4}", $email)){
    print("<strong>Error:</strong> this email address is not in a valid format.<br/><br/><a href='javascript:history.go(-1)'>Back</a>");
         exit;
    }   

  $message = "\n$name submitted the following message:\n\n...\n\n$name's contact details are as follows:\n\nFirst Name: $fname\nLast Name: $lname\nEmail Address: $email";


    $rand = md5(time()); 
    $mime_boundary = '==Multipart_Boundary_x' . $rand . 'x'; 

    if(array_key_exists('fileField', $_FILES)){
        if(is_file($_FILES['fileField']['tmp_name'])){
            $message .= "--{$mime_boundary}\n";
            $fp =    @fopen($_FILES['fileField']['tmp_name'],"rb");
        $data =    @fread($fp,filesize($_FILES['fileField']['tmp_name']));
                    @fclose($fp);
            $data = chunk_split(base64_encode($data));
            $message .= "Content-Type: application/octet-stream; name=\"".$_FILES['fileField']['tmp_name']."\"\n" . 
            "Content-Description: ".$_FILES['fileField']['name']."\n" .
            "Content-Disposition: attachment;\n" . " filename=\"".$_FILES['fileField']['name']."\"; size=".filesize($_FILES['fileField']['tmp_name']).";\n" . 
            "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
            }
        }
    $message .= "--{$mime_boundary}--";

  $headers = 'From: ' . $email;
  mail($mailto, "$subject", $message, $headers);
}
?> 
<div class="contactleft">
        <form action="" method="post" enctype="multipart/form-data" id="former">
        <div class="textbox"><span id="sprytextfield1">
          <label for="fname"></label>
          <input name="fname" type="text" class="inputer" id="fname" />
          <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox -->
        <div class="textbox"><span id="sprytextfield2">
          <label for="lname"></label>
          <input name="lname" type="text" class="inputer" id="lname" />
          <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox -->
        <div class="textbox"><span id="sprytextfield3">
          <label for="email"></label>
          <input name="email" type="text" class="inputer" id="email" />
          <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox -->
        <div class="textbox"><span id="sprytextfield4">
          <label for="file"></label>
          <label for="file"></label>
          <label for="fileField"></label>
          <input type="file" name="fileField" id="fileField" />
          <span class="textfieldRequiredMsg">A value is required.</span></span></div><!-- End TectBox -->
        <div class="textbox">
          <label for="sender"></label>
          <input type="submit" name="sender" id="sender" value="click to send message" />
        </div><!-- End TextBox -->
          </form>
     </div>
    </body>
</html>

答案 3 :(得分:0)

另外我看到你调用mail()函数但是$ file不在其中。我个人使用phpmailer类,然后你声明一个邮件对象,然后添加组件。

// SEND THANK YOU EMAIL
include('class.phpmailer.php');
$mail = new PHPMailer();
// Sender is the Reply-Path address; seems important
$mail->Sender  = "auto-confirm@ca-cycleworks.com";
$mail->From     = "auto-confirm@ca-cycleworks.com";
$mail->FromName = "Ca Cycleworks automated e-mail";
// $mail->AddAddress() is the To:
$blahtext=stripslashes($_SESSION['address_info']['b_first_name'])." ".stripslashes($_SESSION['address_info']['b_last_name']);
$mail->AddAddress($_SESSION['address_info']['b_email'],$blahtext );
$mail->AddReplyTo("orders@ca-cycleworks.com", "Ca Cycleworks Orders");
$subject = "Your Ca-Cycleworks.com Order # ".$_SESSION['order_number']." confirmation";
$mail->Subject = $subject;
$mail->AltBody = $text_body;
//  ISO 8859-1 summary: http://www.btinternet.com/~andrew.murphy/html_character_set.html
//  
//  $Encoding
//     PHPMailer::$Encoding in class.phpmailer.php
//     Sets the Encoding of the message. Options for this are "8bit", "7bit", "binary", "base64", and "quoted-printable".
//  string  $ContentType  =  "text/plain" (line 42)
// False Sets ContentType = "text/html" or "text/plain"
//$mail->IsHTML(false);
$mail->Body    = $body;
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->Username = "auto-confirm@ca-cycleworks.com";
$mail->Password = "xxxxxxxxxxxx";