использование ajax для обработки загрузки файлов - PullRequest
1 голос
/ 28 марта 2019

У меня есть HTML-форма на моем сайте, которая принимает application/pdf file type

<input id="userfile" name="userfile" type="file" accept="application/pdf" style="display:none"/>

И функция js для обработки файла и выполнения запроса ajax:

$('#userfile').on('input', function() {
    var test_test = $('#userfile')[0].files[0];
    var test_form = new FormData();
    test_form.append('file', test_test);
    console.log($('#userfile')[0].files[0]);
    $.ajax({
        url: 'dinkle_berry_test.php',
        method: 'POST',
        processData: false,
        contentType: false,
        cache: false,
        data: {test_form},
        success: function(data){
            console.log(data);
                }
        });
    })

Это то, что я могу подтвердить в консоли: enter image description here

Однако при отправке php echos back:

<br />
<b>Notice</b>:  Undefined index: file in <b>C:\xampp\htdocs\dinkle_berry_test.php</b> on line <b>10</b><br />

Мой PHP-код для dinkle_berry_test.php:

move_uploaded_file($_FILES['file']['tmp_name'], 'C:/xampp/htdocs/tmp_upload/' . $_FILES['file']['name']);

Не получается загрузить файл в эту папку. Не уверен что происходит. Я подготовил несколько форм, но не могу найти рабочий ответ.

Ответы [ 4 ]

0 голосов
/ 28 марта 2019

Проблема заключалась в том, что formData() заключен в фигурные скобки {}.

Поскольку formData уже является объектом, я отправлял объект объектов в файл php. Я просто удалил {} из параметра data вызова ajax, и все работает так, как должно.

Вот что сработало в php:

move_uploaded_file($_FILES['file']['tmp_name'], 'C:/xampp/htdoc/tmp/' . $_FILES['file']['name']);

Надеюсь, это кому-нибудь поможет. Будьте осторожны с обработкой типов данных в любом проекте.

0 голосов
/ 28 марта 2019

Я думаю, что ваша проблема заключается в следующем:

data: {test_form},

, чтобы проверить, получаете ли вы какой-либо файл на стороне сервера, распечатайте вывод переменной файла:

echo var_dump($_FILES);

и запишитевашего результата.

Но:

У меня есть другой скрипт для обработки всех элементов формы:

function ToAjax(form) { //target form
    var jsonObj = [];
    var formData = new FormData();
    //Form element
    $('[name="' + form + '"] *').not(':input[type=file], :input[type=button], :input[type=submit], :input[type=reset], :input[type=checkbox]:not(:checked)').filter(':input').each(function(obj, v) {
        var iObj = {};
        var input = $(this);
        var inputname = input.attr("name");
        if (typeof inputname !== typeof undefined && inputname !== false) { //handle attribute names
            inputname = inputname.replace(/-/g, '_'); //handle underscore
            var val = input.val();
            var inputval = val;
            iObj[inputname] = inputval;
            jsonObj.push(iObj);
        }
    });
    //Summernote textarea editor
    $('[name="' + form + '"] *').filter('div.sumertextarea').each(function(obj, v) {
        var iObj = {};
        var input = $(this);
        var inputname = input.attr("data-name");
        inputname = inputname.replace(/-/g, '_');
        var val = input.summernote('code');
        var inputval = val;
        iObj[inputname] = inputval;
        jsonObj.push(iObj);
    });
    //compres in json data
    jsonData = JSON.stringify(jsonObj);
    //parse json to formdata
    formData.append('jsonData', jsonData);
    //handle all file types input
    $('[name="' + form + '"] *').filter(':input[type=file]').each(function(obj, v) {
        if (typeof v.files[0] != 'undefined') {
            var file = v.files[0];
            var name = $(v).attr("name");
            name = name.replace(/-/g, '_');
            formData.append(name, file);
        }
    });
    //handle all File type from dropzone plugin
    $('[name="' + form + '"] *').filter('div.dropzone').each(function() {
        var DropFile = $(this)[0].dropzone.getAcceptedFiles();
        for (Nof in DropFile) {
            var file = DropFile[Nof];
            var name = DropFile[Nof].name;
            name = name.replace(/-/g, '_');
            formData.append(name, file);
        }
    });
    //send all data packet to send ajax function.
    window.SendAjax(formData);
}

для отправки на серверную частья использую это:

function SendAjax(formdata) {
    var url = 'index.php';
    $.ajax({
        url: url,
        data: formdata,
        contentType: false,
        processData: false,
        type: 'POST',
        cache: false,
        error: function(xhr, status, error) {
            console.log(error);
            alert(error);
        },
        success: function(resp) {
            console.log(resp);
            alert(resp);
        }
    });
}

и да, я использую contenType: false вместо contentType: 'multipart/form-data',

, потому что я могу более легко обрабатывать данные на стороне сервера для доступа к файлам, которые у вас естьПлагин sistema или dropzone для файла 2 seccion проверяет разницу в массиве результатов и позаботится об адаптации или использовании его в вашем проекте:

2 Пример файла отправьте одновременно, PDF и JPG этот выходной тест общей формы $ _FILES иПлагин dropzone:

["i_file"]=>
  array(5) {
    ["name"]=>
    array(2) {
      [0]=>
      string(10) "test.pdf"
      [1]=>
      string(10) "test.jpg"
    }
    ["type"]=>
    array(2) {
      [0]=>
      string(15) "application/pdf"
      [1]=>
      string(10) "image/jpeg"
    }
    ["tmp_name"]=>
    array(2) {
      [0]=>
      string(24) "C  :\ xampp\tmp\phpDDC5.tmp"
      [1]=>
      string(24) "C  :\ xampp\tmp\phpDDC6.tmp"
    }
    ["error"]=>
    array(2) {
      [0]=>
      int(0)
      [1]=>
      int(0)
    }
    ["size"]=>
    array(2) {
      [0]=>
      int(180572)
      [1]=>
      int(8984)
    }
  }

С плагином dropzone:

["test_jpg"]=>
  array(5) {
    ["name"]=>
    string(10) "prueba.jpg"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(24) "C  :\ xampp\tmp\phpDDC7.tmp"
    ["error"]=>
    int(0)
    ["size"]=>
    int(8984)
  }
  ["test_pdf"]=>
  array(5) {
    ["name"]=>
    string(10) "prueba.pdf"
    ["type"]=>
    string(15) "application/pdf"
    ["tmp_name"]=>
    string(24) "C  :\ xampp\tmp\phpDDC8.tmp"
    ["error"]=>
    int(0)
    ["size"]=>
    int(180572)
  }
0 голосов
/ 28 марта 2019

Почему бы не использовать FormData для обработки данных перед их использованием в вашем запросе ajax? Вот ссылка: ССЫЛКА

Надеюсь, это поможет

0 голосов
/ 28 марта 2019

Имя вашего файлового поля - userfile, а в бэкэнде php вы вызываете файловое поле, поэтому вы получаете сообщение об ошибке. Измените свой бэкэнд на

move_uploaded_file($_FILES['userfile']['tmp_name']

Это будет работать ваш AJAX, и все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...