Размещение данных через AJAX в файл PHP - PullRequest
1 голос
/ 31 октября 2019

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

<input id="propertyImages" type="file" name="submission_img[]" multiple accept=".jpg, .jpeg, .png, .gif"/>

Затем я POST эти данные в файл PHP через JS / Ajax:

//Compiling the data which will be POSTed using AJAX. Note that the input above with id of propertyImages is not part of the form with id accommodationForm and is therefore appended to the formData.
var form = $("#accommodationForm")[0]; 
var formData = new FormData(form);

var propertyImages = document.getElementById("propertyImages");

for(var i=0; i<propertyImages.files.length; i++){
   formData.append('propImages[]', propertyImages.files[i]);
}

//Printing to console the formData entries to confirm the formData data:
for (var d of formData.entries()) {
   console.log(d);
}

//The partial code for the ajax call:
$.ajax({
   url: "includes/handlers/ajax_submit_accommodation.php",
   method: "POST",
   data: formData,
...

PHP-код, к которомуданные размещены:

$errorstatus = 0; //Used as an error flag
$maximagesize = 10485760; // Max file size allowed = 10MB    
$acceptableimage = array( //The allowed mime types
    'image/jpeg',
    'image/jpg',
    'image/png',    
);

$submission_images_array = array();

$output = ""; //Used for debugging purposes

for($x=0; $x<30; $x++){ //30 is the upper limit for the amount of images POSTed
    if($_FILES['propImages']['size'][$x] != 0){    
        if( $_FILES['propImages']['size'][$x] >= $maximagesize  || (!in_array($_FILES['propImages']['type'][$x], $acceptableimage))) { 
            $errorstatus = 1;              
        } else {            

            $submission_img = $_FILES['propImages']['name'][$x];   
            $submission_img = pathinfo($submission_img, PATHINFO_FILENAME);  
            $submission_img = $submission_img.'-'.$user_id.'-'.rand().'.jpeg';
            array_push($submission_images_array, $submission_img);

            $submission_img_tmp = $_FILES['propImages']['tmp_name'][$x];

            compressImage($submission_img_tmp, '../../submitted_media/accommodation/'.$submission_img, 50);

            $output .= "$x:"." ".$submission_img."\n";
        } 
    } else {
        $output .= "$x: Empty image\n";
        $submission_img = "";
        array_push($submission_images_array, $submission_img);
    }
}

file_put_contents('../../filenames.txt', $output ); // DEBUG

Я хочу, чтобы пользователь прикрепил максимум 30 изображений. Я удостоверился, что передний и задний конец проверяют это. У меня проблема в том, что я могу прикрепить 30 изображений - отладка подтверждает это с помощью печати на консоли formData ... т.е. formData содержит все данные изображения. Однако, когда я смотрю на filenames.txt, который я вошел в PHP, он содержит только первые 20 имен файлов, а последние 10 записей записываются как «Пустое изображение» (как я указывал в коде, если размер изображения равен 0).

Примечания:

  1. Я убедился (используя другой код JS), что propertyImages.files.length в цикле for не может быть больше 30 и что приЯ прилагаю 30 изображений, длина которых действительно равна 30.

  2. Я убедился, что max_input_vars в файле PHP.ini не является проблемой.

  3. Размеры изображений последних 10 файлов НЕ равны 0. Это было подтверждено регистрацией formData

1 Ответ

1 голос
/ 31 октября 2019

Ознакомьтесь с директивой max_file_uploads :

max_file_uploads integer

Максимальное количество файлов, разрешенных для одновременной загрузки,

Как показано в таблице в разделе «Загрузка файлов», по умолчанию используется значение 20:

Name              Default   Changeable       Changelog
...
max_file_uploads  20        PHP_INI_SYSTEM   Available since PHP 5.2.12.

Вам нужно будет обновить это значение до php.ini.

Также убедитесь, что вы не превышаете post_max_size или upload_max_filesize .

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