Отправка и загрузка файлов с php и phpmailer - PullRequest
0 голосов
/ 09 января 2020

Я не могу понять, как сделать файл из моей контактной формы загруженным и отправленным. Я попытался выполнить поиск на github, но не могу понять, в какую часть моего кода я должен вставить его, а что - в него. Это последняя часть скрипта html. Я пытался сделать это таким образом, но теперь он просто отправляет мне пустой файл. Спасибо всем за помощь

<?php
$nome = $_POST["nome-locale"];
$email = $_POST["email"];
$telefono = $_POST["telefono"];
$indirizzo = $_POST["indirizzo"];
$civico = $_POST["civico"];
$citta = $_POST["citta"];
$provincia = $_POST["provincia"];
$cap = $_POST["cap"];
$newsletters = $_POST["newsletters"];
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name']));






$body = "<br>nome-locale:" . $nome .  
     	 "<br>Email:" . $email .   
      	"<br>TelefonoLocale:" . $telefono . 
    	"<br>Indirizzo:" . $indirizzo . 
       "<br>Civico:" . $civico . 
    	"<br>Città:" . $citta. 
    	"<br>Provincia:" . $provincia .
	    "<br>Cap:" . $cap . 
	   "<br>newsletters:" . $newsletters;


use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;



require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);

try {
    //Server settings
    
    $mail->isSMTP();                                            // Send using SMTP
    $mail->Host       = 'xxxx';                    // Set the SMTP server to send through
    $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
    $mail->Username   = 'xxxx';                     // SMTP username
    $mail->Password   = 'xxxxxxx';                               // SMTP password
    $mail->SMTPSecure = 'ssl';                         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted
    $mail->Port       = 465;                                    // TCP port to connect to

    //Recipients
    $mail->setFrom('xxxxxx', $name);
    $mail->addAddress('xxxxxxx');     // Add a recipient
    
    
  // Attach the uploaded file
        $mail->addAttachment($uploadfile, 'My uploaded file');

    // Content
    $mail->isHTML(true);                                  // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = $body;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
	
	
	  
    
	

    $mail->send();
    echo '<script>
	alert("Messaggio inviato correttamente");
	window.history.go(-1);
	</script>';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
?>
<div class="form-group was-validated ">
                   <label class="control-label" name="userfile" enctype="multipart/form-data">Menu1</label>
                <input type="file"  required>
  
</div>
					 <div class="form-group was-validated ">
                   <label class="control-label">Menu2</label>
                <input type="file"  required>
			
					<hr>
					<div class="form-group was-validated  ">
					 <div class="custom-control custom-checkbox mb-3" >
   <input  type="checkbox" class="custom-control-input" id="customControlValidation1"  required>
<label class="custom-control-label" for="customControlValidation1" ><small>Dichiaro di aver letto, accettato e di concordare con le <a href="https://www.google.it/" target="_blank" >Clausole Generali e l'Informativa sulla privacy.</a> Vaimenu.it permette ai locali e agli ospiti di comunicare tramite Vaimenu.it, che riceve ed elabora le comunicazioni in conformità con l'Informativa sulla privacy e le Clausole Generali di xxxx.</small></label>

					  </div>
			
						<div class="form-group was-validated  ">
					 <div class="custom-control custom-checkbox mb-3" >
   <input  type="checkbox" class="custom-control-input" id="customControlValidation2"  checked>
<label class="custom-control-label" for="customControlValidation2" name="newsletters" ><small>Voglio iscrivermi alla newsletter per ricevere promozioni ed altre comunicazione da parte di xxxxx</small></label>

						</div>
									
                <button class="btn btn-success btn-lg fa-pull-right" type="submit">Finito!<img src="img/star.svg" style="top: auto"></button>

1 Ответ

0 голосов
/ 09 января 2020

Я понимаю, что это HTML является лишь частью вашей формы, верно? На вопрос, что я не вижу никаких элементов для ввода email telefono cap и нескольких других.

Другое дело, что это:

<label class="control-label" name="userfile" enctype="multipart/form-data">

обычно неверно - я имею в виду: атрибут enctype здесь не имеет смысла, на самом деле он должен go элементу <form> (так как вы говорите, что ваша форма отправляет файлы, я предполагаю, что на самом деле это работает, только проблема с файлами - это проблема).

Основная проблема, с которой вы столкнулись, заключается в том, как вы обрабатываете загруженный файл:

$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name']));

Если вы попробуете этот код (для обучения):

<?php
if (isset($_FILES['my-file'])) {
    var_dump($_FILES['my-file']);
    var_dump(tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['my-file']['name'])));
}
?>
<!doctype html>
<html>
    <head>
        <title>sample</title>
    </head>
    <body>
        <form action="1.php" enctype="multipart/form-data" method="post">
            <input type='file' name='my-file'>
            <input type="submit">
        </form>
    </body>
</html>

вы заметите (после загрузка файла) примерно так:


array(5) {
  ["name"]=>
  string(21) "flight_to_hamburg.pdf"
  ["type"]=>
  string(15) "application/pdf"
  ["tmp_name"]=>
  string(14) "/tmp/phpS2dWIg"
  ["error"]=>
  int(0)
  ["size"]=>
  int(76044)
}
string(75) "/tmp/ecb918e45ff9059a9ad1b7b52c5c0d24575f8ac19474f2f13c908801eafaa48bLMlIeG"

, который ясно показывает, что sha256 - это не то, что PHP использует для создания имен временных файлов.

С PHP Mailer позволяет указывать на файл и отправлять его под другим именем, тогда в моем примере это было бы просто:

$path = $_FILES['my-file']['tmp_name']; //actual path to the file
$name = $_FILES['my-file']['name']; //actual name of the file
$mail->addAttachment($path, $name);

Если вы хотите сохранить файл локально после отправки, обязательно также вызовите move_uploaded_file как если нет, то файл будет потерян.

* 103 0 * Так что в вашем примере это будет:
$path = $_FILES['userfile']['tmp_name']; //actual path to the file
$name = $_FILES['userfile']['name']; //actual name of the file
$mail->addAttachment($path, $name);

, если вы хотите HA SH имя файла, по какой-то причине сделайте это с переменной $name; $path должен привести к существующему файлу.

Также, если у вас нет JavaScript, который создает FormData при отправке и отправке файла, используя только стандартную обработку форм в браузере, тогда ОБЯЗАТЕЛЬНО измените ОДИН из ваших:

<input type="file"  required>

до

<input type="file" name="userfile" required>

имя должно совпадать: таким образом PHP определяет, какие данные были отправлены из каких полей HTML формы.

...