Отправить php почту с файлом asynch

Это действительно сводит меня с ума.

Это проблема, у меня есть форма X с некоторыми текстовыми вводами и одним входным файлом. В моем сценарии я выполняю предыдущую проверку и после этого отправляю ее в файл x.php, который отправляет почту и возвращает ответ, после чего страница изменяется в зависимости от этого ответа. Проблема в том, что файл x.php не получает файл таким способом.

HTML

<form action="/" method="post" enctype="multipart/form-data" id="hv_form" name="hv_form">
<input type="text" name="name" placeholder="Nombre completo" />
<input type="email" name="email" placeholder="E-mail" />
<input type="text" name="phone" placeholder="Teléfono" />
<input type="file" name="hv_file" id="hv_file" />
<label for="hv_file">
<img src="https://web-answers.ru/wp-content/uploads/2019/02/addFile.svg" />
Elige un archivo...
</label>
<button class="submit submit_file trans35" type="submit">Enviar archivo</button>
</form>

Jquery

function send_file(trigger, dataOrigin) {
// trigger > the button inside form to submit data
// dataOrifin > the form

$(trigger).on( 'click', function(e) {
e.preventDefault();

var error = false,
$name = $(dataOrigin +" [class*='name']").val(),
$email = $(dataOrigin +" [class*='email']").val(),
$phone = $(dataOrigin +" [class*='phone']").val(),
$file = $(dataOrigin +" [id='hv_file']").val();

//Check empty inputs or errors
if($name.length == 0){
var error = true;
$(dataOrigin +" [class*='name']").queue(function(){$(this).addClass('cont_error').dequeue();}).delay(err_wt).queue(function(){$(this).removeClass('cont_error').dequeue();});
} else {
$(dataOrigin +" [class*='name']").removeClass('cont_error');
}
//. . . etc


//Send message and file
if (error == true) {
//do something if previous error
} else if (error == false) {

$.post("send_file.php", $(dataOrigin).serialize(),function(result){
var r = JSON.parse(result);
console.log( r );

if (r[0] == 1) {
// if php file responses "1" means sent
// do something...
console.log( "[HV] "+dataOrigin +": Mensaje enviado");

} else if (r[0] == 0) {
// if php file responses "0" means NOT sent
// do something...
console.log( "[HV] "+ dataOrigin +": Mensaje NO enviado");
}
});

}

PHP-код

<?php

$email_to = '[email protected]';   //email de la empresa
$business = 'xxxxxx';    //nombre de la empresa

$name       = $_POST['name'];
$email_from = $_POST['email'];
$phone      = $_POST['phone'];
$file       = $_FILES['hv_file'];

//Correo
$headers = "From: Postulacion web <$email_from>" . "\r\n";
$headers .= "Reply-To: $name <$email_from>\r\n";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=UTF-8 " . "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion(). "\r\n";

$subject    =  "$name ha enviado su curriculum"; //Asunto del mensaje
$message_full = "Hello world";

$r;
if(mail($email_to, $subject, $message_full, $headers)){
$r = '1';
} else {
$r = '0';
}
$toSend = [$r, $file ];

echo json_encode($toSend);
?>

Но таким образом $ _FILES (в файле php) всегда пустой, что я делаю не так?

И если я удаляю ‘protectDefault’ и отправляю форму естественным образом, нажав кнопку, файл php получит файл!

Пожалуйста, помоги мне! Я в полном отчаянии!

0

Решение

Я немного изменил ваш AJAX, но у меня есть решение, которое работает. В вашем коде я не мог видеть, как вы вызываете функцию send_file (). Так что я избавился от этого и использовал кнопку, чтобы запустить JQuery.

Убедитесь, что у вас установлен jQuery.

Вы также увидите некоторые изменения в своем HTML. Все получает идентификаторы, и я изменил кнопку на type = «button».

Вам придется переписать некоторые из ваших форм проверки.

Но тем не менее эта работа, и она должна дать вам хороший пример для работы. Это будет работать каждый раз, когда вы нажимаете кнопку.

HTML

<form action="/" method="post" enctype="multipart/form-data" id="hv_form" name="hv_form">
<input id="name" type="text" name="name" placeholder="Nombre completo" />
<input id="email" type="email" name="email" placeholder="E-mail" />
<input id="phone" type="text" name="phone" placeholder="Teléfono" />
<input id="hv_file" type="file" name="hv_file" />
<label for="hv_file">

Elige un archivo...
</label>
<button id="sendFile" class="submit submit_file trans35" type="button">Enviar archivo</button>
</form>

JQuery

<script>

$(document).ready(function(){

$('#sendFile').on( 'click', function(e) {

e.preventDefault();

var myForm = new FormData();

myForm.append('name',    $('#name').val());
myForm.append('email',   $('#email').val());
myForm.append('phone',   $('#phone').val());
myForm.append('hv_file', $('#hv_file')[0].files[0]);

$.ajax({
url: 'send_file.php',
type: 'POST',
data: myForm,
success: function (result) {

var r = JSON.parse(result);
console.log( r );

if (r[0] == 1) {
// if php file responses "1" means sent
// do something...
//console.log( "[HV] "+dataOrigin +": Mensaje enviado");

} else if (r[0] == 0) {
// if php file responses "0" means NOT sent
// do something...
//console.log( "[HV] "+ dataOrigin +": Mensaje NO enviado");
}

},
cache: false,
contentType: false,
processData: false

});

});

});


</script>

Ваш PHP выглядел хорошо для меня. Но вам нужно убедиться, что вы подтверждаете свой пост & файл в вашем скрипте PHP, чтобы убедиться, что ничего нежелательного не проходит.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]