我的问题
所以我一直在尝试使用JavaScript(XHR(和PHP创建一个简单的文件上传系统,但我遇到了一个问题,即一旦文件上传到PHP
handler
,它总是返回$_FILES
是而不是集。
代码
JavaScript(在服务器www.example.com
上(:
var file = document.getElementById("fileInput").files[0];
var formData = new FormData();
formData.append("track", file);
var xhr = new XMLHttpRequest();
xhr.open("POST", "//handle.example.com/uploads.php", true);
xhr.onload = function(){
if(xhr.status == 200)
// awesome, it worked
else
return console.error("Something went wrong.");
};
xhr.send(formData);
PHP(在服务器handle.example.com
上(:
header("Access-Control-Allow-Origin: http://www.example.com", false);
if(isset($_FILES["track"])){
$file = $_FILES["track"];
$fileTemp = $file["tmp_name"];
$fileSize = filesize($fileTemp);
if($fileSize <= 150000000)
$data = "Success"; // this is returned if a file is an image file
} else
$data = "File not set."; // this is returned if a file is an audio file
echo $data;
exit;
HTML(在服务器www.example.com
上(:
<form method="post" enctype="multipart/form-data" id="ulF_uF1">
<input type="file" name="file" accept="audio/x-aiff,audio/flac,audio/mpeg,audio/ogg,audio/wav" id="fileInput">
</form>
我尝试过的
- 将
upload_max_filesize
和post_max_size
分别设置为150M
和151M
- 更改字段名称
- 将
$_FILES
更改为$_POST
这些对我都不起作用,而且我似乎找不到其他与我的问题相关的可行解决方案,所以我们非常感谢您的帮助。
更新:
经过一些仔细的测试,我意识到我的上传脚本实际上运行得很好。它不喜欢的是正在上传的文件类型。由于某些原因,PHP(至少7.2.1版本(不喜欢我上传音频文件;上传图像文件或PDF
的工作正常。
xhr.setRequestHeader("Content-Type", "multipart/form-data");
格式化为multipart/form-data
的请求的Content-Type
标头必须包含一个boundary
参数,以告诉消息的接收方每个新数据位的起始位置。
通过手动提供没有标头的标头,可以使请求不可解析。
拆下那根线。允许XMLHttpRequest使用FormData对象为您生成正确的内容类型标头。