Как исправить ‘ERR_ACCESS_DENIED’ при загрузке нескольких файлов

#javascript #php #jquery #http-post

#javascript #php #jquery #http-post

Вопрос:

Я пытаюсь загрузить несколько файлов на сервер. Это работает нормально, когда есть один файл, но как только их становится несколько, я получаю «ERR_ACCESS_DENIED». Не уверен, связано ли это как-то с моими разрешениями или просто с моим наивным кодом. Заранее спасибо!

PHP:

 session_start();
function outputJSON($msg, $code = 0, $status = 'error'){
    header('Content-Type: application/json');
    if ($code == 200 || $code == 201){
        echo $code;
        exit();
    }
    echo $msg . "||" . $code . "||" . $status;
    die();
}
//ERROR CODES:
//200 - Upload and Processing successful;
//201 - Upload and Processing successful; - Rename made
//400 - Upload Failed
//511 - Not Authorized
//520 - Unknown
$tempDir = guidv4();
mkdir("disk/processing/" . $tempDir);
$putdir = 'disk/processing/' . $tempDir . '/';

if (isset($_FILES['files']) amp;amp; !empty($_FILES['files'])) {
    $no_files = count($_FILES["files"]['name']);
    for ($i = 0; $i < $no_files; $i  ) {
        if ($_FILES["files"]["error"][$i] > 0) {
            outputJSON($_FILES["files"]["error"], 520, 'error');
        } else {
            if (file_exists($putdir . $_FILES["files"]["name"][$i])) {
                move_uploaded_file($_FILES["files"]["tmp_name"][$i], $putdir . $_FILES["files"]["name"][$i] . ' (1)');
                outputJSON($tempDir, 200, 'done');
            } else {
                move_uploaded_file($_FILES["files"]["tmp_name"][$i], $putdir . $_FILES["files"]["name"][$i]);
                outputJSON($tempDir, 201, 'done');
            }
        }
    }
} else {
    outputJSON('Empty Upload.', 400, 'error');
}
  

JS / JQ

             $('#information').show();
            var form_data = new FormData();
            var ins = document.getElementById('multiFiles').files.length;
            for (var x = 0; x < ins; x  ) {
                form_data.append("files[]", document.getElementById('multiFiles').files[x]);
            }

            $.ajax({
                url: 'uploadbackend.php', // point to server-side PHP script
                dataType: 'application/json', // what to expect back from the PHP script
                cache: false,
                contentType: false,
                processData: false,
                data: form_data,
                type: 'post',
                xhr: function() {
                    var started_at = new Date();
                    xhr.upload.addEventListener( 'progress', function( e )
                    {
                        if( e.lengthComputable )
                        {
                            // Append progress percentage.
                            var loaded = e.loaded;
                            var total = e.total;
                            var progressValue = Math.round( ( loaded / total ) * 100 );

                            // Bytes received.
                            jQuery( '.recievedValue' ).html( '' );
                            jQuery( '.recievedValue' ).append( humanFileSize( loaded )   ' / ' );

                            // Total bytes.
                            jQuery( '.totalValue' ).html( '' );
                            jQuery( '.totalValue' ).append( humanFileSize( total ) );

                            // Time Remaining
                            var seconds_elapsed =   ( new Date().getTime() - started_at.getTime() )/1000;
                            var bytes_per_second =  seconds_elapsed ? loaded / seconds_elapsed : 0 ;
                            var Kbytes_per_second = bytes_per_second / 1000 ;
                            var remaining_bytes =   total - loaded;
                            var seconds_remaining = seconds_elapsed ? remaining_bytes / bytes_per_second : 'calculating' ;
                            jQuery( '.timeRemaining' ).html( '' );
                            jQuery( '.timeRemaining' ).append( seconds_remaining );

                            // Percentage.
                            $('#_explorer_progress').css("width",  ""   progressValue   "%")
                            if (progressValue >= 100){
                                $('#information').html('Processing...')
                            }

                        }
                    }, false );
                    return xhr;
                },
                success: function (response) {
                    $('#information').html('Done.');
                    $('#upload').html('Uploaded! <i class="fa fa-check ml-5"></i>');
                    $('#upload').removeClass('btn-primary');
                    $('#upload').removeClass('btn-danger');
                    $('#upload').addClass('btn-info');
                    document.getElementById("upload").disabled = true;
                    $('#msg').html(response); // display success response from the PHP script
                    setTimeout(function () {
                        $('#upload').html('Start Upload <i class="fa fa-upload ml-5"></i>');
                        document.getElementById("upload").disabled = false;
                        $('#upload').addClass('btn-primary');
                        $('#upload').removeClass('btn-danger');
                        $('#upload').removeClass('btn-info');
                        $("#multifiles").val('');
                    }, 3000)
                },
                error: function (response) {
                    $('#information').html('There was a problem.');
                    console.log(response);
                }
            });
  

HTML:

 <input type="file" id="multiFiles" name="files[]" multiple="multiple"/>
  

От сервера нет ответа, кроме ошибки «ERR_ACCESS_DENIED» в запросе POST.

Когда есть один файл, он функционирует должным образом.

Комментарии:

1. Вы настроили права на выполнение и запись для файла PHP? Просмотр разрешений для файлов ls -lha и чтение, запись, выполнение, установленные с помощью chmod 750 file.php . Сделайте файл исполняемым также с помощью chmod x file.php .

2. @Raymond Да, я это сделал! Я тестировал это с восьмеричным 777 и по-прежнему ничего…