Как преодолеть ошибку post 405 на сервере Windows 2012 R2

#javascript #php #html #post #http-status-code-405

#javascript #php #HTML #Публикация #http-status-code-405

Вопрос:

У меня есть небольшое тестовое приложение для записи камеры и отправки файла в каталог на моем сервере. Основной файл выглядит следующим образом:

 <!DOCTYPE html>
<html>
    <head>
        <script src="https://cdn.WebRTC-Experiment.com/RecordRTC.js"></script>
        <style>
            video {
              max-width: 100%;
              border: 5px solid yellow;
              border-radius: 9px;
            }
            body {
              background: black;
            }
            h1 {
              color: yellow;
            }
        </style>
    </head>

    <body>
        <h1 id="header">RecordRTC Upload to PHP</h1>
        <video id="your-video-id" controls="" autoplay=""></video>

        <script type="text/javascript">
            // capture camera and/or microphone
            navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then(function(camera) {

                // preview camera during recording
                document.getElementById('your-video-id').muted = true;
                document.getElementById('your-video-id').srcObject = camera;

                // recording configuration/hints/parameters
                var recordingHints = {
                    type: 'video'
                };

                // initiating the recorder
                var recorder = RecordRTC(camera, recordingHints);

                // starting recording here
                recorder.startRecording();

                // auto stop recording after 5 seconds
                var milliSeconds = 5 * 1000;
                setTimeout(function() {

                    // stop recording
                    recorder.stopRecording(function() {
                        
                        // get recorded blob
                        var blob = recorder.getBlob();

                        // generating a random file name
                        var fileName = getFileName('webm');

                        // we need to upload "File" --- not "Blob"
                        var fileObject = new File([blob], fileName, {
                            type: 'video/webm'
                        });

                        uploadToPHPServer(fileObject, function(response, fileDownloadURL) {
                            if(response !== 'ended') {
                                document.getElementById('header').innerHTML = response; // upload progress
                                return;
                            }

                            document.getElementById('header').innerHTML = '<a href="'   fileDownloadURL   '" target="_blank">'   fileDownloadURL   '</a>';

                            alert('Successfully uploaded recorded blob.');

                            // preview uploaded file
                            document.getElementById('your-video-id').src = fileDownloadURL;

                            // open uploaded file in a new tab
                            window.open(fileDownloadURL);
                        });

                        // release camera
                        document.getElementById('your-video-id').srcObject = null;
                        camera.getTracks().forEach(function(track) {
                            track.stop();
                        });

                    });

                }, milliSeconds);
            });

            function uploadToPHPServer(blob, callback) {
                // create FormData
                var formData = new FormData();
                formData.append('video-filename', blob.name);
                console.log("blob.name:");
                console.log(blob.name);
                formData.append('video-blob', blob);
                callback('Uploading recorded-file to server.');
                makeXMLHttpRequest('https://xxx/yyy/', formData, function(progress) {
                    if (progress !== 'upload-ended') {
                        callback(progress);
                        return;
                    }
                    var initialURL = 'https://xxx/yyy/'   blob.name;
                    callback('ended', initialURL);
                });
            }

            function makeXMLHttpRequest(url, data, callback) {
                var request = new XMLHttpRequest();
                request.onreadystatechange = function() {
                    if (request.readyState == 4 amp;amp; request.status == 200) {
                        if (request.responseText === 'success') {
                            callback('upload-ended');
                            return;
                        }
                        alert(request.responseText);
                        return;
                    }
                };
                request.upload.onloadstart = function() {
                    callback('PHP upload started...');
                };
                request.upload.onprogress = function(event) {
                    callback('PHP upload Progress '   Math.round(event.loaded / event.total * 100)   "%");
                };
                request.upload.onload = function() {
                    callback('progress-about-to-end');
                };
                request.upload.onload = function() {
                    callback('PHP upload ended. Getting file URL.');
                };
                request.upload.onerror = function(error) {
                    callback('PHP upload failed.');
                };
                request.upload.onabort = function(error) {
                    callback('PHP upload aborted.');
                };
                request.open('POST', url);
                request.send(data);
            }

            // this function is used to generate random file name
            function getFileName(fileExtension) {
                var d = new Date();
                var year = d.getUTCFullYear();
                var month = d.getUTCMonth();
                var date = d.getUTCDate();
                return 'RecordRTC-'   year   month   date   '-'   getRandomString()   '.'   fileExtension;
            }

            function getRandomString() {
                if (window.crypto amp;amp; window.crypto.getRandomValues amp;amp; navigator.userAgent.indexOf('Safari') === -1) {
                    var a = window.crypto.getRandomValues(new Uint32Array(3)),
                        token = '';
                    for (var i = 0, l = a.length; i < l; i  ) {
                        token  = a[i].toString(36);
                    }
                    return token;
                } else {
                    return (Math.random() * new Date().getTime()).toString(36).replace(/./g, '');
                }
            }
        </script>
    </body>
</html>  

в месте, где хранятся файлы, у меня есть следующий файл

 <?php


// path to ~/tmp directory
$tempName = $_FILES['video-blob']['tmp_name'];


// move file from ~/tmp to "uploads" directory
if (!move_uploaded_file($tempName, $filePath)) {
    // failure report
    echo getcwd();
    echo " | ";
    echo 'Problem saving file: '.$tempName .' to ' .$filePath .' Not uploaded because of error #'.$_FILES['video-blob']['error'];
    
    if (!is_writable($filePath)) {
        echo " | ";
        echo "dir not writable or existing";
      }
    
    die();
}

// success report
echo 'success';
?>  

Когда я запускаю это на своем локальном сервере, оно работает нормально. Но когда я загружаю его на свой сервер Windows 2012 R2, я получаю сообщение об ошибке

СООБЩЕНИЕ https://xxx/yyy / 405 (Метод не разрешен)

Я попытался поиграть с сопоставлениями обработчиков в ISS и отключил WebDAV, но безуспешно. Поскольку он работает на локальном хосте, но не на сервере Windows, я полагаю, что это должно быть что-то связанное с настройкой IIS, но не могу выяснить, что.

Любая помощь приветствуется.

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

1. Вы уверены, что это ошибка сценариев, а не ошибка серверов? Вы пробовали запускать простой скрипт, например echo 'Hello World!'; ?

2. Почему ваш запрос направляется в https://xxx/yyy/ , а не в фактический файл PHP, предположительно находящийся в этой папке? https://xxx/yyy/yourscript.php

Ответ №1:

В конце концов я сам обнаружил ошибку.

Настройки в файле web.config неправильно установлены для FastCgiModule / StaticFileModules.