Ajax文件上载不仅仅适用于一台服务器

时间:2014-05-16 21:27:01

标签: php jquery ajax

我制作了以下脚本来说明问题。用户选择文件后,文件将上传到同一个脚本,并返回从file_get_contents("php://input")获取的文件名和文件大小。

<?php
if (isset($_REQUEST["upload"])) {
    // received upload - echoing file information
    if (isset($_SERVER["HTTP_X_FILE_NAME"])) {
        $src_file = file_get_contents("php://input");
        $filesize = strlen($src_file);      
        echo "Received via Ajax\n\n";
        echo "Filename: ".$_SERVER["HTTP_X_FILE_NAME"]."\n\n";
        echo "Filesize: ".$filesize;        
    }
} else { ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
        "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
        <head>
            <title>Ajax upload test</title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
        </head>
        <body>
            <div>
                <form enctype="multipart/form-data" id="upload_form" method="post" action="<?php echo $_SERVER["PHP_SELF"]?>">
                    <div>
                        <input type="file" id="fileselect" name="fileselect[]" multiple="multiple" class="textbox" /><br />
                    </div>
                </form>
                <script type="text/javascript">
                    //<![CDATA[
                    if (window.File && window.FileList && window.FileReader) {
                        $('#fileselect').on('change', function(e) {
                            var files = e.target.files || e.originalEvent.dataTransfer.files;
                            for (var i=0, file; file=files[i]; i++) {
                                $.ajax({
                                    url: 'ajaxuploadtest.php?upload',
                                    type: 'POST',
                                    cache: false,
                                    contentType: false,
                                    processData: false,
                                    data: file,
                                    beforeSend: function(request) {
                                        request.setRequestHeader('X-File-Name', encodeURIComponent(file.name));
                                    },
                                    success: function(file_upload_response) {
                                        alert(file_upload_response);
                                    }
                                });
                            }                   
                        });
                    }
                    //]]>               
                </script>
            </div>
        </body>
    </html>
<?php } ?>

问题是它不能在我需要使用它的托管服务器上运行。它适用于我尝试过的所有其他托管服务器(如6个),但在这一台服务器上,如果选择上传文件,则success事件永远不会触发。它没有报告任何错误。

这让我发疯了 - 我甚至不知道该怎么告诉托管公司,他们可能已经改变了一些服务器设置,但我不知道如何诊断错误。< / p>

更新:Firebug显示对XHR的响应是403 Forbidden - 您无权访问此服务器上的/ajaxuploadtest.php。 (ajaxuploadtest.php是脚本的文件名)。为什么会这样?我如何访问它以便首先从它发送请求?

1 个答案:

答案 0 :(得分:0)

他们在没有告诉我的情况下迁移了网站的服务器上的mod_security。它不仅不允许文件上传,而且不允许通过POST发送引号,撇号和省略号字符。我让他们关掉一切。我真的不明白这些疯狂的安全规则背后的原因,比如你可以没有撇号的文本内容。