Как получить данные $ _FILES через ajax в том же формате, что и через чистый PHP - PullRequest
0 голосов
/ 22 марта 2019

У меня работает скрипт загрузки.Единственное, что мне нужно отредактировать, это формат массива $ _FILES.

Мой HTML

<input id="upload_dialog" name="file[]" type="file" multiple>

Мой Javascript

<script>
    $('#upload_dialog').on('change', function(event) {
      var form = new FormData();
      $.each(event.target.files, function(key, value) {
        form.append(key, value);
      });

      $.ajax({
        url: 'url,
        type: 'POST',
        data: form,
        processData: false,
        contentType: false,
        cache: false,
        async: true,
        done: function(data) {
          data = JSON.parse(data);

      });
    });
</script>

Этот массив я получу, загрузив файлы черезajax.

array(2) {
  [0]=>
  array(5) {
    ["name"]=>
    string(11) "ps-logo.jpg"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(23) "/home/www/tmp/phpMBu4TE"
    ["error"]=>
    int(0)
    ["size"]=>
    int(24722)
  }
  [1]=>
  array(5) {
    ["name"]=>
    string(12) "tnk-logo.png"
    ["type"]=>
    string(9) "image/png"
    ["tmp_name"]=>
    string(23) "/home/www/tmp/php9yPGpf"
    ["error"]=>
    int(0)
    ["size"]=>
    int(23748)
  }
}

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

array(1) {
  ["file"]=>
  array(5) {
    ["name"]=>
    array(2) {
      [0]=>
      string(12) "tnk-logo.png"
      [1]=>
      string(11) "ps-logo.jpg"
    }
    ["type"]=>
    array(2) {
      [0]=>
      string(9) "image/png"
      [1]=>
      string(10) "image/jpeg"
    }
    ["tmp_name"]=>
    array(2) {
      [0]=>
      string(23) "/home/www/tmp/phpWGezym"
      [1]=>
      string(23) "/home/www/tmp/phpIqOpKY"
    }
    ["error"]=>
    array(2) {
      [0]=>
      int(0)
      [1]=>
      int(0)
    }
    ["size"]=>
    array(2) {
      [0]=>
      int(23748)
      [1]=>
      int(24722)
    }
  }
}

Есть ли какие-нибудь простыеспособ, как отправить данные через AJAX, чтобы получить этот тип массива?

1 Ответ

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

Решение JavaScript

Вместо добавления файлов в качестве элементов новой формы, создайте экземпляр FormData, используя форму, внутри которой уже введены данные.

$('#upload_dialog').on('change', function(event) {
    var input = event.target,
        form = input.form,
        data = new FormData(form);

    $.ajax({
        url: '/form.php',
        type: 'POST',
        data: data,
        processData: false,
        contentType: false,
        cache: false,
        async: true,
        done: function(data) {
            data = JSON.parse(data);
        }
    });
});

Мое оригинальное не очень хорошее решение PHP

Чтобы PHP обрабатывал оба способа отправки файлов, вы можете сделать что-то вроде этого, чтобы преобразовать его в нужный вам формат, если он еще не в этом формате:

function maybe_ajax_files($field) {
    // If $_FILES is empty or it's already got the field we need,
    // just use it as-is.
    if (empty($_FILES) || isset($_FILES[$field])) {
        return $_FILES;
    }

    // Otherwise, regroup them...
    $regrouped = array();
    foreach ($_FILES as $file) {
        foreach ($file as $key => $val) {
            if (!isset($regrouped[$key])) {
                $regrouped[$key] = array();
            }
            $regrouped[$key][] = $val;
        }
    }

    // Then assign that array to the desired field in a new array.
    $files = array();
    $files[$field] = $regrouped;
    return $files;
}

// 'file' is the name of the field in your example:
// <input id="upload_dialog" name="file[]" type="file" multiple>
$files = maybe_ajax_files('file');
...