现在我正在尝试编写一个只接受某些音频文件上传到服务器的脚本。
但是,某些MIME类型将返回null。
以下是一些代码片段:
PHP:
$allowedExt=array('audio/mp4a-latm');
if(isset($_POST))
{
print_r($_FILES);
//ToDo: Limit by File Size
if(in_array($_FILES["fileUpload"]["type"],$allowedExt)){
echo "file type found";
}
else
echo "wrong file type";
}
HTML:
<form action="php/FileUpload.php" method="POST" enctype="multipart/form-data">
Choose a file: <input name="fileUpload" type="file" /><br />
<input type="submit" value="Upload" />
</form>
以上结果是:
Array ( [fileUpload] => Array ( [name] => 02 Helix Nebula.m4a [type] => [tmp_name] => <removed for space...>))
wrong file type
据我所知,type应该返回文件的MIME类型。在这种情况下,'audio / mp4a-latm'表示.m4a文件。
如果php正确地为.m4a文件返回null,那么确保我实际处理音频文件的最佳方法是什么?除了解析文件扩展名之外还有其他更明确的内容吗? (确保某人没有更改说文本文件的扩展名)
答案 0 :(得分:3)
MIME元素来自浏览器,这意味着它可以被操纵,因此不值得信任。
检查扩展名,或者如果你真的想要,解析文件的前几个字节以确保它符合预期。
答案 1 :(得分:1)
$_FILES['userfile']['type']
- 文件的mime类型,如果浏览器提供此信息。
http://www.php.net/manual/en/features.file-upload.post-method.php
这就是为什么这种方法效果不好的原因。您应该比较从
抓取的文件扩展名$_FILES['userfile']['name']
带有可接受的扩展数组(您应该自己创建)
答案 2 :(得分:0)
要获取文件的mime类型,可以使用
http://code.google.com/p/filing-cabinet/source/browse/trunk/mime_type_lib.php?spec=svn127&r=127
我使用它超过2年,到目前为止它是非常可靠的库。
答案 3 :(得分:0)
如果您使用的是php 5.3或更高版本,则可以通过在php.ini
中转义此行来激活php文件信息扩展名:
extension=php_fileinfo.dll
然后你可以从php中的文件中获取你的mime类型:
$pathToFile = 'my/path/to/file.ext';
$fileInfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($fileInfo, $pathToFile);
finfo_close($fileInfo);
这比使用浏览器通过$_FILES
请求在POST
数组中向您发送的内容更可靠。