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

时间:2015-03-31 20:35:58

标签: javascript php ajax http request

因此,我查找a tutorial上传文件并将文件发送到带有XML HTTP请求的服务器。我遵循了教程,但是,我认为我必须遗漏一些东西。当文件似乎被上传和发送时,"处理程序"文件被访问过。我需要编写一个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.
    });
});

在&#34;发送(formData)&#34;我不确定它是否正在发送。我是否在FileHandler.php中设置了某种类型的侦听器,当通过XML HTTP请求发送文件时,该侦听器会被激活?或者更具体地说,如何使用我的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中执行这些操作?

1 个答案:

答案 0 :(得分:0)

感谢@FlorianLefè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);

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