需要帮助处理XML HTTP文件上载请求

Need Help Handling a XML HTTP File Upload Request

本文关键字:文件 上载 请求 HTTP XML 帮助 处理      更新时间:2023-09-26

因此,我查阅了一个使用XMLHTTP请求上传文件并将其发送到服务器的教程。我遵循了教程,但是,我想我一定错过了什么。虽然文件看起来是上传和发送的,但"处理程序"文件中的任何内容都不会被访问。我需要编写一个PHP函数来处理它吗?就上下文而言,以下是我所写的:

$(document).ready(function()
{
    $('#upload-button').click(function(event)
    {
        $('#upload-button').removeClass("btn-danger");
    });
    $( "#report-form" ).submit(function( event )
    {
        var form = document.getElementById('report-form');
        var fileSelect = document.getElementById('file-select');
        var uploadButton = document.getElementById('upload-button');
        event.preventDefault(); // Stop the event from sending the way it usually does.
        uploadButton.value = 'Submitting...'; // Change text.
        var files = fileSelect.files;
        var maxfiles = <?php echo $config['Report_MaxFiles'] ?>;
        var mfs = <?php echo $config['Report_MaxFileSize'] ?>;
        if(files.length > maxfiles) // Make sure it's not uploading too many.
        {
            uploadButton.value = 'You uploaded too many files. The limit is ' + maxfiles + '.'; // Update button text.
            $('#upload-button').addClass('btn-danger'); // Make the button red, if so.
            return;
        }
        var formData = new FormData(); // Make a "form data" variable.
        for (var i = 0; i < files.length; i++) {
            var file = files[i];
            // Add the file to the request.
            if(file.size / 1000 > mfs)
            {
                uploadButton.value = 'One of the files is too big. The file size limit is ' + (mfs) + 'kb (' + (mfs / 1000) + 'mb).';
                $('#upload-button').addClass('btn-danger');
                return;
            }
            formData.append('files[]', file, file.name); // Not really sure what this does, to be honest,
                                                          // but I think it makes a file array.
        }
        var xhr = new XMLHttpRequest(); // Construct an XML HTTP Request
        xhr.open('POST', 'assets/class/FileHandler.php', true); // Open a connection with my handler PHP file.
        xhr.onload = function ()
        {
            if (xhr.status === 200)
            {
                uploadButton.value = 'Files Submitted!'; // NOTE: I do get this message.
            }
            else
            {
                uploadButton.value = 'An error occurred.';
                $('#upload-button').addClass("btn-danger");
            }
        };
        xhr.send(formData); // I think this is where it dies.
    });
});

在"send(formData)"行,我实际上不确定它是否在发送。我是否在FileHandler.php中设置了某种侦听器,当通过XMLHTTP请求发送文件时,该侦听器会被激活?或者更具体地说,如何使用FileHandler.php文件将上传的文件保存到服务器?

编辑:我还没能在FileHandler.PHP文件中找到除此之外的任何其他PHP代码,我认为在发送表单时可能会调用它(但事实并非如此):

编辑2:好吧,现在我有东西了,但它不起作用(没想到)。我想我可能用错了变量:

<?php
$uploaddir = 'data/reports/uploads/' . $_POST['id'] . "/";
$uploadfile = $uploaddir . basename($_FILES['files']['name']);
echo "<script>console.log('RECEIVED');</script>";
echo '<pre>';
if (move_uploaded_file($_FILES['files']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.'n";
} else {
    echo "Possible file upload attack!'n";
}
echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";

它没有将文件保存到目录中,也没有打印脚本消息。如何让我的report.php文件在FileHandler.php中执行这些内容?

感谢@Florian Lefèvre的帮助和耐心,我修复了它。:)

问题出在路径上。它没有找到文件夹data/uploads/的路径,也没有创建目录。以下是我所做的:

$uploaddir = '../../data/reports/uploads/' . $_POST['id'] . "/";
echo "NAME: " . $_FILES['files']['name'][0] . "'n";
foreach($_FILES['files']['name'] as $filenumber => $filename)
{
    $uploadfile = $uploaddir . basename ($filename);
    echo "UploadDir " . $uploaddir . "'n";
    echo "UploadFile " . $uploadfile . "'n";
    echo '<pre>';
    echo "MKDir for UploadDir which is: ". $uploaddir . "'n";
    mkdir ($uploaddir);
    if (move_uploaded_file ($_FILES['files']['tmp_name'][$filenumber], $uploadfile))
    {
        echo "File is valid, and was successfully uploaded.'n";
    }
    else
    {
        echo "Possible file upload attack!'n";
    }
    echo 'Here is some more debugging info:';
    print "</pre>";
}
var_dump ($_FILES);

我还没有摆脱一些调试的东西,但这是一般的解决方案。