Задать вопрос

Не отправляется файл через AJAX?

Добрый день.
Есть форма:
<form id="f_job" class="mod_f" method="POST" enctype="multipart/form-data">
                <input id="file_input" class="chose_file_input" name="file" type="file" />
                <input type="submit" value="Отправить">
</form>

Есть обработчик:
$('form#f_job').submit(function(event){
            event.preventDefault();
            var formNm = $('#f_job');
            $.ajax({
                url: "/mail.php",
                type: "post",
                dataType: "html",
                data: formNm.serialize(),
                success: function(data){
                    console.log(data);
                },
            });
        });

Ну и сам mail.php:
$method = $_SERVER['REQUEST_METHOD'];
$c = true;
if ( $method === 'POST' ) {
	$project_name = "1";
	$admin_email = "2";
	$form_subject = "3";
        $picture = "";
    if (!empty($_FILES['file']['tmp_name']))
    {
        $path = $_FILES['file']['name'];
        if (copy($_FILES['file']['tmp_name'], basename($_FILES['file']['name']))) $picture = $path;
    }
    foreach ($_POST as $key => $value) {
	//создаем сообщение
    }
    $message = "<table style='width: 100%;'>$message</table>";
    if (!empty($_FILES['file']['tmp_name'])) {
        mail_to($picture, $admin_email, "1", $message);//если форма с файлом
    }
    else {
        mail_to($picture, $admin_email, "0", $message);//если форма без файла
    }
}
function mail_to($file_name, $mail_to, $file, $text) {
    $message = $text;
    $boundary = "--".md5(uniqid(time()));
    $mailheaders = "MIME-Version: 1.0;\r\n";
    $mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
    $multipart = "--$boundary\r\n";
    $multipart .= "Content-Type: text/html; charset=windows-1251\r\n";
    $multipart .= "Content-Transfer-Encoding: base64\r\n";
    $multipart .= "\r\n";
    $multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));// первая часть само сообщение

    if ($file == "1") {
        $filepath = $file_name;// месторасположение файла
// Закачиваем файл
        $fp = fopen($filepath,"r");
        if (!$fp)
        {
            echo "Не удается открыть файл";
            exit();
        }
        $file = fread($fp, filesize($filepath));
        fclose($fp);
// чтение файла
        $message_part = "\r\n--$boundary\r\n";
        $message_part .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n";
        $message_part .= "Content-Transfer-Encoding: base64\r\n";
        $message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
        $message_part .= "\r\n";
        $message_part .= chunk_split(base64_encode($file));
        $message_part .= "\r\n--$boundary--\r\n";
// второй частью прикрепляем файл, можно прикрепить два и более файла
        $multipart .= $message_part;
    }
    mail($mail_to,$subject,$multipart,$mailheaders);
}

Текст отправляется, файл нет. Мое мнение, что файл на сервер не грузится. Подскажите, что не так.
  • Вопрос задан
  • 1149 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
yuraSco
@yuraSco Автор вопроса
Может кому понадобится
$('form#f_job').submit(function(event){
            event.preventDefault();
            var formNm = $('#f_job')[0];
            var formData = new FormData(formNm);
            // отправляем данные
            $.ajax({
                url: "/mail.php",
                type: "post",
                data: formData,
                contentType: false,
                processData: false,
                success: function(data){
                    console.log(data);
                },
            });
        });
Ответ написан
Комментировать
Rema1ns
@Rema1ns
и так сойдет
Что бы высылать файлы через аякс надо использовать FormData
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы