1

У меня вот такой скрипт.

<?php
        include("connectdb.php");
//проверяем загрузку файла на наличие ошибок
if($_FILES['uploadfile']['error'] > 0)
{
 //в зависимости от номера ошибки выводим соответствующее сообщение
 //UPLOAD_MAX_FILE_SIZE - значение установленное в php.ini
 //MAX_FILE_SIZE значение указанное в html-форме загрузки файла
 switch ($_FILES['uploadfile']['error'])
 {
 case 1: echo 'Размер файла превышает допустимое значение UPLOAD_MAX_FILE_SIZE'; break;
 case 2: echo 'Размер файла превышает допустимое значение MAX_FILE_SIZE'; break;
 case 3: echo 'Не удалось загрузить часть файла'; break;
 case 4: echo 'Файл не был загружен'; break;
 case 6: echo 'Отсутствует временная папка.'; break;
 case 7: echo 'Не удалось записать файл на диск.'; break;
 case 8: echo 'PHP-расширение остановило загрузку файла.'; break;
 }
 exit;
}

//проверяем MIME-тип файла
if($_FILES['uploadfile']['type'] != 'audio/mpeg')
{
 echo 'Вы пытаетесь загрузить не текстовый файл.';
 exit;
}

//проверяем не является ли загружаемый файл php скриптом,
//при необходимости можете дописать нужные типы файлов
$blacklist = array(".php", ".phtml", ".php3", ".php4");
foreach ($blacklist as $item)
{
 if(preg_match("/$item\$/i", $_FILES['uploadfile']['name']))
 {
 echo "Выбраный вами файл не являеться mp3 файлом.";
 exit;
 }
}

//папка для загрузки
$uploaddir = 'audioupload/';
//новое сгенерированное имя файла
$newFileName=date('YmdHis').rand(10,100).'.mp3';
//путь к файлу (папка.файл)
$uploadfile = $uploaddir.$newFileName;

//загружаем файл move_uploaded_file
if (move_uploaded_file($_FILES['uploadfile']['tmp_name'], $uploadfile)) {
echo "Выбранный файл загружен.\n";
} else {
 echo "Ошибка загрузки файла.\n"; 
}
//считываем содержания файла
$fp = fopen($uploadfile, 'r');
$contents = fread($fp, filesize ($uploadfile));
fclose($fp);

//чистим от php и html дескрипторов
$contents = strip_tags($contents);
$fp = fopen($uploadfile, 'w');
fwrite($fp, $contents);
fclose($fp);
?>

Форма:

<form action="uploadmusic-finish" method="post" ENCTYPE="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="512000000">
        <input type="file" name="uploadfile" required><br />
        <input type="submit" value="Загрузить">
        </form>

Я хочу сделать себе загрузку аудиозаписей на сервер. Точнее просто заливать на сервер аудио. Скрипт полностью рабочий, вот только когда начинаю загружать мзуыку в формате mp3 (в других не пробывал), он выдет мне ошибку "Вы пытаетесь загрузить не текстовый файл.". Я так понял это изза MIME типа. Я перепробывал все на mp3 и ни один не подошел, все равно выдает такую ошибку. Подскажите мне пожалуйста, какой мне поставить MIME тип, что бы все работало или что заменить в скрипте.

P.S. пробывал другие MIME типы (image/JPEG) - работало.

4
  • Если вы принимаете аудиофайлы, я бы посоветовал задействовать SoX на сервере, чтобы сразу после принятия файла, проверять его как именно аудио: кодек, продолжительность, битрейт, возможные мета данные. Так подстрелите сразу двух зайцев: убедитесь, что это не php или вирус, и сохраните доп. инфу типа названия трека / артиста.
    – Sergiks
    26 июл 2014 в 8:45
  • Видимо вы даже скрипт не смотрели, потому что там все это есть.
    – cnofss
    26 июл 2014 в 9:35
  • Смотрел. Полагаться на mime type не стоит, т.к. это всего лишь HTTP заголовок, с которым вашему серверу отдают файл. Я могу отправить php и добавить заголовок, будто это "audio/mpeg". SoX же именно анализирует содержание файла, и вытаскивает из него всё, что можно. А также легко например, пересэмплирует в более низкий bitrate или другой формат.
    – Sergiks
    26 июл 2014 в 9:50
  • Может, вы не поняли, я предлагаю по принятии файла, запускать shell команду, которая прогонит принятый файл через утилиту sox, которая точно даст знать, аудио ли это в принципе файл, или нет. Мы так делаем на нашем сервисе. Все аплоады попадают в одну точку - будь то картинки, видео или аудио. И не обращая внимания на MIME мы разными утилитами разбираем, что же это за файл, и можем ли мы что-то с ним сделать.
    – Sergiks
    26 июл 2014 в 9:53

1 ответ 1

0

До

//проверяем MIME-тип файла
if($_FILES['uploadfile']['type'] != 'audio/mpeg')
{
 echo 'Вы пытаетесь загрузить не текстовый файл.';
 exit;
}

Сделайте

die($_FILES['uploadfile']['type']);

И посмотрите что выведет.

4
  • audio/mp3 - вот что выдает. То есть это и есть mime тип? Работает, только как то странно, вчера пробывал этот тип, все равно не чего не получалось. Спасибо.
    – cnofss
    26 июл 2014 в 9:11
  • Осталась одна проблема. Файл загружается не полностью. Загружает 18 577 байт, а на самом деле он весит 413 812 байт
    – cnofss
    26 июл 2014 в 9:31
  • Посмотрите в php.ini. Там есть max_file_upload (или как то похоже) и оно по умолчанию маленькое какое-то.
    – dlarchikov
    27 июл 2014 в 8:57
  • <input type="hidden" name="MAX_FILE_SIZE" value="512000000"> У меня это записано в форме и через $_POST потом выводит в обработчике
    – cnofss
    31 июл 2014 в 7:57

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.