我制作了以下脚本来说明问题。用户选择文件后,文件将上传到同一个脚本,并返回从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是脚本的文件名)。为什么会这样?我如何访问它以便首先从它发送请求?
答案 0 :(得分:0)
他们在没有告诉我的情况下迁移了网站的服务器上的mod_security
。它不仅不允许文件上传,而且不允许通过POST发送引号,撇号和省略号字符。我让他们关掉一切。我真的不明白这些疯狂的安全规则背后的原因,比如你可以没有撇号的文本内容。