2012-03-11 93 views
3

現在我正在嘗試編寫一個腳本,它只接受某些音頻文件上傳到服務器。

但是,某些MIME類型被返回爲空。

下面是一些代碼片段:

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 

從我的理解,類型應該返回文件的MIME類型。在這種情況下,用於.m4a文件的'audio/mp4a-latm'。

如果php正確返回null爲.m4a文件,那麼確保我實際處理音頻文件的最佳方法是什麼?有什麼比解析文件擴展名更明確嗎? (確保有人沒有改變說文本文檔的擴展名)

+0

我不知道爲什麼它不會在你的情況下返回正確的文件類型(可能缺少一些簡單的東西 - 它應該),但如果。m4a的mime類型被定義爲服務器上的音頻(通常你甚至可以在共享主機環境中自己定義這個),那麼通過擴展進行檢查並沒有太大的危險。不過,我同意實際解決問題會更好。 – Ynhockey 2012-03-11 09:28:47

回答

3

MIME元素來自瀏覽器,這意味着它可以被操縱,因此是不可信的。

請檢查擴展名,或者如果您真的想要解析文件的前幾個字節,以確保它是預期的。

+1

爲了擴大話題 - 你可以避免重新發明輪子,並使用[Fileinfo](http://php.net/manual/en/book.fileinfo.php) – ashein 2012-03-11 10:53:48

+0

@ashein非常好的一點檢查文件。這是一個非常不愉快的輪子重新創建。 (問題提供者:在99%的情況下,擴展白名單通常就足夠了。) – Corbin 2012-03-11 20:08:20

+0

擴展也相當不可靠:) – Wilt 2014-11-11 17:00:35

0

如果您使用PHP 5.3或更高版本,你可以逃脫此行激活PHP文件信息擴展您的php.ini

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); 

這比使用瀏覽器從POST請求發送給$_FILES的數組更有效。