Javascript 通过电子邮件发送上载的文件而不先保存

Javascript 通过电子邮件发送上载的文件而不先保存,javascript,file,email,upload,Javascript,File,Email,Upload,我正在创建一个应用程序,允许用户附加一个文件,键入一条消息,然后使用wordpress的PHP mailer插件发送一封电子邮件。我使用javascript从上传html表单获取文件信息,然后使用php发送电子邮件。当使用以下功能发送保存在服务器上特定位置的文件时,该插件工作: $mail->AddAttachment("./new6.txt","attachment"); 我想知道是否有一种方法可以通过电子邮件发送选定的文件,而不必将其保存到服务器。换句话说,用户是否可以选择要上载的文

我正在创建一个应用程序,允许用户附加一个文件,键入一条消息,然后使用wordpress的PHP mailer插件发送一封电子邮件。我使用javascript从上传html表单获取文件信息,然后使用php发送电子邮件。当使用以下功能发送保存在服务器上特定位置的文件时,该插件工作:

$mail->AddAttachment("./new6.txt","attachment");
我想知道是否有一种方法可以通过电子邮件发送选定的文件,而不必将其保存到服务器。换句话说,用户是否可以选择要上载的文件,但使用此php函数发送该文件,而不将其保存在要检索的位置?我知道有一个$_FILES数组,您可以获取文件的信息,但该文件是否可以在不首先保存的情况下发送?我猜不是因为上传表单的全部目的是上传它,而是想知道是否可以用javascript或其他什么东西来完成


感谢您的帮助

您不能真正做到这一点,但您可以这样做以获得接近效果:

$filename = $_FILES['file_name']['tmp_name'];
$main->AddAttachment($filename, "attachment");

// Send the email... then:
unset($filename);

这会将文件添加为附件,发送电子邮件,然后删除文件。$_files数组中上载的文件最终将自动清除,因此我不确定未设置的部分是否有任何重要作用,但它肯定会清除该文件。

如果不将文件保存在服务器中,则无法将其附加到邮件中

1> 邮件功能正在服务器中执行。 2> 无法从服务器获取客户端计算机中的绝对文件路径,因为在web中,客户端计算机没有任何绝对地址。 3> 所以需要将文件上传到服务器中,以获得文件在邮件附件中的真实路径。
我知道这是一个相当古老的问题,但我认为有一个相当有用的答案从未给出过。为了那些像我这样的人,在寻找这个问题或类似问题的答案时,我也遇到了这个问题,给你答案

当您从表单上传文件到服务器时,它会自动保存到tmp目录。从技术上讲,不保存表单上传的文件是不可能做任何事情的,因为它是为您自动完成的。但是,由于每次重新启动时都会自动清理tmp,因此如果您经常重新启动或设置cron定期删除tmp目录内容,这就不应该成为积累太多积压工作的问题

但是,由于它已保存到tmp,并且您可以从那里操作该文件,因此可以发送该文件,而无需保存任何形式的寿命,也无需实际写入任何保存内容。如果您对文件执行了所有必要的安全检查,以验证内容、MIME类型以及我现在不想讨论的内容,但是您可以了解如何执行,您可以使用下面的php函数,我从中获得并修改了该函数,以使用tmp文件。你所需要做的就是通过考试 参数和$files是您希望已经检查过的文件数组

function multi_attach_mail($to, $subject, $message, $senderEmail, $senderName, $files = array()){ 

    $from = $senderName." <".$senderEmail.">";  
    $headers = "From: $from"; 

    // Boundary  
    $semi_rand = md5(time());  
    $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";  

    // Headers for attachment  
    $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";  

    // Multipart boundary  
    $message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" . 
    "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";  

    // Preparing attachment 
    if(!empty($files)){ 
        for($i=0; $i<count($files); $i++){
            if(is_file($files[$i]["tmp_name"])){ 
                $tmp_name = basename($files[$i]["tmp_name"]);
                $file_name = $files[$i]["name"];
                $file_size = filesize($files[$i]["tmp_name"]); 

                $message .= "--{$mime_boundary}\n"; 
                $fp =    fopen($files[$i]["tmp_name"], "rb"); 
                $data =  fread($fp, $file_size); 
                fclose($fp); 
                $data = chunk_split(base64_encode($data)); 
                $message .= "Content-Type: application/octet-stream; name=\"".$file_name."\"\n" .  
                "Content-Description: ".$file_name."\n" . 
                "Content-Disposition: attachment;\n" . " filename=\"".$file_name."\"; size=".$file_size.";\n" .  
                "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; 
            }
        } 
    } 

    $message .= "--{$mime_boundary}--"; 
    $returnpath = "-f" . $senderEmail; 

    // Send email    
    $mail = mail($to, $subject, $message, $headers, $returnpath);  

    // Return true, if email sent, otherwise return false 
    if($mail){ 
        return true; 
    }else{ 
        return false; 
    } 
}

$filename应该来自服务器,而不是客户端计算机。