我知道这是一个相当古老的问题,但我认为有一个从未给出过的相当有用的答案。为了像我这样在寻找这个问题或类似问题的答案时遇到这个问题的人,给你。
当您从表单上传文件到服务器时,它会自动保存到 tmp 目录。从技术上讲,在不保存的情况下对表单上传的文件进行任何操作是不可能的,因为它是自动为您完成的。但是,因为 tmp 会在每次重新启动时自动清除,如果您经常重新启动或设置一个 cron 来定期删除您的 tmp 目录内容,这不应该是建立太多积压的问题。
但是,因为它被保存到 tmp,并且因为您可以从那里操作文件,所以可以在不保存任何形式的长寿的情况下发送文件,并且无需实际编写任何内容来保存它。如果您对文件执行了所有必要的安全检查(验证内容、MIME 类型等,我现在不会介绍,但您可以在此处阅读如何操作),您可以使用以下 php 函数我从Codexworld得到并修改为使用 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;
}
}