2012-03-11 2 views
3

Сейчас я пытаюсь написать сценарий, который будет принимать только определенные аудиофайлы для загрузки на сервер.

Однако некоторые типы 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 

Из того, что я понимаю, , тип должен возвращать файл MIME. В этом случае «audio/mp4a-latm» для файла .m4a.

Если php корректно возвращает null для файлов .m4a, тогда какой лучший подход обеспечить, чтобы я действительно имел дело с аудиофайлами? Есть ли что-то более определенное, чем просто синтаксический разбор файлов? (убедитесь, что кто-то не изменил расширение текстового документа)

+0

Я не уверен, почему он не возвращает правильный тип файла в вашем случае (возможно, отсутствует что-то простое - оно должно), но если.Тип mime m4a определяется как аудио на сервере (обычно вы можете определить это самостоятельно даже в среде общего хостинга), тогда при выполнении проверки по расширению не так много опасности. Тем не менее, я согласен, что было бы лучше решить проблему. – Ynhockey

ответ

3

Элемент MIME поступает из браузера, что означает, что его можно манипулировать и, следовательно, не заслуживает доверия.

Либо проверьте расширение, либо, если вы действительно хотите, проанализируйте первые несколько байтов файла, чтобы убедиться, что это то, что ожидается.

+1

Чтобы развернуть тему, вы можете избежать повторного использования колеса и проверить файл с помощью [Fileinfo] (http://php.net/manual/en/book.fileinfo.php) – ashein

+0

@ashein очень хороший момент. Это очень неприятное колесо для воссоздания. (На вопрос вопрос: в 99% ситуаций, хотя, белый список расширений, как правило, достаточно.) – Corbin

+0

Расширения также довольно ненадежны :) – Wilt

1

$_FILES['userfile']['type'] - Тип mime файла, Если в браузере указанная информация.

http://www.php.net/manual/en/features.file-upload.post-method.php

Вот почему этот метод не работает хорошо. Вы должны сравнить расширение файла схватился из

$_FILES['userfile']['name'] 

с приемлемым массив расширений (которые вы должны создать сами)

0

Если вы используете PHP 5.3 или выше вы можете активировать расширение PHP Информация о файле убегая эту строку в вашем php.ini:

extension=php_fileinfo.dll 

Тогда вы можете получить тип пантомимы из файла в PHP, как это:

$pathToFile = 'my/path/to/file.ext'; 
$fileInfo = finfo_open(FILEINFO_MIME_TYPE); 
$mimeType = finfo_file($fileInfo, $pathToFile); 
finfo_close($fileInfo); 

Это более надежно, чем с помощью того, что браузер посылает вас в $_FILES массив из вашего POST запроса.