как передать файл и другую форму данных с помощью ajax в виде объекта POST на php-страницу и сохранить его в базе данных?

  • У меня есть форма с текстовыми данными, и я хочу отправить содержимое формы и файл с помощью метода POST ajax в обработчик Proccess.php, и я хочу получить двоичный файл как объект, чтобы вставить его в базу данных (mysql).
  • я знаю, что сохранение файла в базе данных является странным, но в этом случае это необходимо.
  • и еще один вопрос: почему данные POST отправляются в массив $_POST, а $_POST['file'], который поступает из <input type="file" name="file"> с той же страницы, не определен?

вот мой код: обработчик PHP: (proccess.php, который ajax отправляет данные на эту страницу):

<?php
    $mysqli = new mysqli('localhost', 'root', '', 'msgsys');
    if(mysqli_connect_errno()) {
        print_r("<h4 id='senterror'>Connection Failed: " . mysqli_connect_errno()."</h4>");
        exit();
    }
    $email = $_POST['email'];
    $file = $_FILES['file']['name']; //i'll try to give an object property to sure that the object exists;
    $file2 = $_POST['file']; //the same attemp;
    print_r($file);
    if($stmt = $mysqli -> prepare("SELECT uid FROM user WHERE eaddress=?")) {
        $stmt->bind_param("s", $email);
        $stmt->execute();
        $result = $stmt->get_result();
        while ($row = mysqli_fetch_row($result)) {
            $recUid = $row[0];
        }
        $stmt->close();
        if (!$result || mysqli_num_rows($result) <= 0) {
            print_r("<h4 id='senterror'>You Can not Mailing To Who doesn't exists!</h4>");
            $mysqli->close();
            exit();
        } else {
            date_default_timezone_set('ASIA/Tehran');
            $today = date('m/d/Y-H:i:s');
            $stmt = $mysqli->prepare("INSERT INTO message (sdeltag,rdeltag,rreadtag,timesent,body,subjecttxt,sender,receiver) VALUES ('0','0','0',?,?,?,'1',?)");
            $stmt->bind_param("ssss",$today,$_POST['txt'], $_POST['subject'],$recUid);
            $stmt->execute();
            print_r("<h4 id='mailsent'>Message Sent Successfully!</h4>");
            $stmt->close();
        }
        $mysqli->close();
    }
?>

аякс:

$(document).ready(function () {
        $('#sendmail').submit(function () {
            var that = this;
            $('#response').html("<b>Loading response...</b>");
            $.ajax({
                type: 'POST',
                url: 'proccess.php',
                data: $(that).serialize()
            })
                .done(function (data) {
                    $('#response').html(data);

                })
                .fail(function () {
                    alert("Posting failed.");

                });
            this.reset();
            return false;

        });
    });

person Francesco    schedule 24.12.2014    source источник
comment
См. stackoverflow.com /вопросы/166221/   -  person Musa    schedule 24.12.2014
comment
@Musa, это только файл, а как насчет других полей данных формы?   -  person Francesco    schedule 24.12.2014
comment
Когда вы публикуете файл, вы не получаете к нему доступ с помощью $_POST['file'], он сохраняется в глобальной переменной сервера для файлов: $_FILES['file']   -  person Colum    schedule 24.12.2014
comment
@ARH Вы читали этот ответ stackoverflow.com/a/8758614/1353011   -  person Musa    schedule 24.12.2014
comment
@Colum $_FILES['file'] говорит, что он не определен, но я думаю, что все содержимое формы, содержащее файл, отправляется с помощью ajax в proccess.php, не так ли?   -  person Francesco    schedule 24.12.2014
comment
Недавно я сделал что-то подобное этому, я не смог опубликовать файл с помощью Ajax, поэтому я просто сделал целью формы скрытый iframe, дождался загрузки iframe (т.е. завершения php) и использовал Ajax для очистки формы   -  person Colum    schedule 24.12.2014
comment
Посмотрите на это: blog.teamtreehouse.com/uploading-files-ajax   -  person Colum    schedule 24.12.2014
comment
@Musa, я реализую то, как ты связался с ним, это даст мне это error:Uncaught ReferenceError: beforeSendHandler is not defined   -  person Francesco    schedule 24.12.2014


Ответы (2)


я перепишу часть ajax, как показано ниже, и у меня все будет хорошо:

$(document).ready(function () {
    $('#sendmail').submit(function () {
        var formData = new FormData($('form')[0]);
        $('#response').html("<b>Loading response...</b>");
        $.ajax({
            url: 'proccess.php',  //Server script to process data
            type: 'POST',
            data: formData,
            async: false,
            success: function (msg) {
                $('#response').html(msg);
            },
            cache: false,
            contentType: false,
            processData: false
        });
        this.reset();
        return false;
    });
});
person Francesco    schedule 24.12.2014

Вы можете использовать этот AJAX для сохранения значений ваших полей.

 $(document).ready(function (e) {
    $("#YourButtonID").on('submit',(function(e) {
    e.preventDefault();
    var fileValue = $('#file').val();
    if(fileValue !='')
    {
        $.ajax({
            url: "submitFile.php", 
            type: "POST",             
            data: new FormData(this), 
            contentType: false,                  
            processData:false,        
            success: function(data)   
            {
                $("#message").html('Image Uploaded Successfully..!!');
                $('#ShowImage').show();
                //$('#file').val('');
                $('#ShowImage').attr("src",data);
            }
        });
    }
    else
    {
        alert("Please Choose file!");
        return false;
    }
    }));

    });

Это часть HTML

<form id="uploadimage" method="post" enctype="multipart/form-data">
   <div id="message"></div><br/>    
   <img src="" id="ShowImage" style="display:none;"><br/><br/>
   <label>File:</label>
   <input type="file" name="file" id="file" /><br/><br/>
   <input type="submit" value="Upload" name="submit" id="submit" />
</form>

И на стороне PHP напишите этот код

<?php
    if($_FILES["file"] !='')
    {
        $name = strtolower($_FILES['file']['name']);
        $File_Ext = substr($name, strrpos($name, '.')); 
        if($name !='' && $File_Ext !='')
        {       
            $NewFileName = time().$File_Ext;
        }

        $cmpltPath = "uploads/".$NewFileName; 
        move_uploaded_file($_FILES['file']['tmp_name'],$cmpltPath) ;
        echo $cmpltPath;
    }
    else
    {
        echo "Failure!!";
    }
?>
person Sunil Pachlangia    schedule 16.01.2015