PHP$_FILES不允许上传音频文件(wav、mp3、aiff等),但允许任何其他类型的扩展



我的问题


所以我一直在尝试使用JavaScript(XHR(和PHP创建一个简单的文件上传系统,但我遇到了一个问题,即一旦文件上传到PHPhandler,它总是返回$_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_filesizepost_max_size分别设置为150M151M
  • 更改字段名称
  • $_FILES更改为$_POST

这些对我都不起作用,而且我似乎找不到其他与我的问题相关的可行解决方案,所以我们非常感谢您的帮助。

更新:


经过一些仔细的测试,我意识到我的上传脚本实际上运行得很好。它不喜欢的是正在上传的文件类型。由于某些原因,PHP(至少7.2.1版本(不喜欢我上传音频文件;上传图像文件或PDF的工作正常。

xhr.setRequestHeader("Content-Type", "multipart/form-data");

格式化为multipart/form-data的请求的Content-Type标头必须包含一个boundary参数,以告诉消息的接收方每个新数据位的起始位置。

通过手动提供没有标头的标头,可以使请求不可解析。

拆下那根线。允许XMLHttpRequest使用FormData对象为您生成正确的内容类型标头。

最新更新