Загрузка .mp3 Тип файла - PullRequest
1 голос
/ 26 апреля 2009

Я работаю над сценарием загрузки PHP, который позволяет загружать файлы .mp3 среди других. Я создал массив, в котором указаны разрешенные типы файлов, включая mp3, и установил максимальный лимит загрузки 500 МБ:

// define a constant for the maximum upload size
define ('MAX_FILE_SIZE', 5120000);

// create an array of permitted MIME types
$permitted = array('application/msword', 'application/pdf', 'text/plain', 'text/rtf', 'image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/tiff', 'application/zip', 'audio/mpeg', 'audio/mpeg3', 'audio/x-mpeg-3', 'video/mpeg', 'video/mp4', 'video/quicktime', 'video/x-ms-wmv', 'application/x-rar-compressed');

До сих пор при тестировании все указанные типы файлов были успешно загружены, но по какой-то причине возникает ошибка .mp3. Как вы можете видеть выше, я включил audio / mpeg, audio / mpeg3 и audio / x-mpeg-3, но ни один из них, похоже, не имеет значения.

Может кто-нибудь подсказать, в чем может быть проблема, а также указать, какой тип аудио нужен для загрузки .mp3?

Спасибо

Обновление: Код, который я использую для проверки файла, выглядит следующим образом:

// check that file is within the permitted size
        if ($_FILES['file-upload']['size'][$number] > 0 || $_FILES['file-upload']['size'][$number] <= MAX_FILE_SIZE) {
            $sizeOK = true;
        }

        // check that file is of an permitted MIME type
        foreach ($permitted as $type) {
            if ($type == $_FILES['file-upload']['type'][$number]) {
                $typeOK = true;
                break;
            }
        }

        if ($sizeOK && $typeOK) {
            switch($_FILES['file-upload']['error'][$number]) {
                case 0:
                    // check if a file of the same name has been uploaded
                    if (!file_exists(UPLOAD_DIR.$file)) {
                        // move the file to the upload folder and rename it
                        $success = move_uploaded_file($_FILES['file-upload']['tmp_name'][$number], UPLOAD_DIR.$file);
                    }
                    else {
                        // strip the extension off the upload filename
                        $filetypes = array('/\.doc$/', '/\.pdf$/', '/\.txt$/', '/\.rtf$/', '/\.gif$/', '/\.jpg$/', '/\.jpeg$/', '/\.png$/', '/\.tiff$/', '/\.mpeg$/', '/\.mpg$/', '/\.mp4$/', '/\.mov$/', '/\.wmv$/', '/\.zip$/', '/\.rar$/', '/\.mp3$/');
                        $name = preg_replace($filetypes, '', $file);
                        // get the position of the final period in the filename
                        $period = strrpos($file, '.');
                        // use substr() to get the filename extension
                        // it starts one character after the period
                        $filenameExtension = substr($file, $period+1);
                        // get the next filename    
                        $newName = getNextFilename(UPLOAD_DIR, $name, $filenameExtension); 
                        $success = move_uploaded_file($_FILES['file-upload']['tmp_name'][$number], UPLOAD_DIR.$newName);
                    }
                    if ($success) {
                        $result[] = "$file uploaded successfully";
                    }
                    else {
                        $result[] = "Error uploading $file. Please try again.";
                    }
                    break;
                case 3:
                    $result[] = "Error uploading $file. Please try again.";
                default:
                    $result[] = "System error uploading $file. Contact webmaster.";
            }
        }
        elseif ($_FILES['file-upload']['error'][$number] == 4) {
            $result[] = 'No file selected';
        }
        else {
            $result[] = "$file cannot be uploaded. Maximum size: $max. Acceptable file types: doc, pdf, txt, rtf, gif, jpg, png, tiff, mpeg, mpg, mp3, mp4, mov, wmv, zip, rar.";
        }

Я получаю нижний результат, сообщающий, что размер файла неправильный или расширение не разрешено.

Обновление 2: Я запустил print_r массива _FILES, чтобы, надеюсь, предоставить немного больше информации. Результаты:

Массив ( [file-upload] => Массив ( [name] => Массив ( [0] => Моцарт.mp3 [1] => [2] => ) * * Тысяча двадцать-один

        [type] => Array
            (
                [0] => audio/mpg
                [1] => 
                [2] => 
            )

        [tmp_name] => Array
            (
                [0] => /Applications/MAMP/tmp/php/phpgBtlBy
                [1] => 
                [2] => 
            )

        [error] => Array
            (
                [0] => 0
                [1] => 4
                [2] => 4
            )

        [size] => Array
            (
                [0] => 75050
                [1] => 0
                [2] => 0
            )

    )

)

Ответы [ 6 ]

10 голосов
/ 26 апреля 2009

MAX_FILE_SIZE - это значение в байтах

5120000 - это не 500 МБ. По моим расчетам, это 5 МБ.

Вам также необходимо убедиться, что вы не превышаете переменные "post_max_size" и "upload_max_size" в файле php.ini

Во-вторых, mp3 может быть любым из следующих mimetypes

  • аудио / MPEG
  • аудио / X-MPEG
  • аудио / mp3
  • аудио / x-mp3
  • аудио / mpeg3
  • аудио / х-mpeg3
  • аудио / MPG
  • аудио / х миль на галлон
  • аудио / х-mpegaudio

http://filext.com/file-extension/MP3

1 голос
/ 01 июня 2012

Я сомневаюсь, что вам все еще нужно это, но я уверен, что многие также столкнутся с этой же проблемой. Это то, что я сделал, и это сработало для меня.

Код Php:

if(isset($_POST['submit'])) {

    $fileName = $_FILES['userfile']['name'];
    $tmpName = $_FILES['userfile']['tmp_name'];
    $fileSize = $_FILES['userfile']['size'];
    $fileType = $_FILES['userfile']['type'];

if ($fileType != 'audio/mpeg' && $fileType != 'audio/mpeg3' && $fileType != 'audio/mp3' && $fileType != 'audio/x-mpeg' && $fileType != 'audio/x-mp3' && $fileType != 'audio/x-mpeg3' && $fileType != 'audio/x-mpg' && $fileType != 'audio/x-mpegaudio' && $fileType != 'audio/x-mpeg-3') {
        echo('<script>alert("Error! You file is not an mp3 file. Thank You.")</script>');
    } else if ($fileSize > '10485760') {
        echo('<script>alert("File should not be more than 10mb")</script>');
    } else if ($rep == 'Say something about your post...') {
    $rep == '';
    } else {
    // get the file extension first
    $ext = substr(strrchr($fileName, "."), 1); 

    // make the random file name
    $randName = md5(rand() * time());

    // and now we have the unique file name for the upload file
    $filePath = $uploadDir . $randName . '.' . $ext;

    $result = move_uploaded_file($tmpName, $filePath);
    if (!$result) {
        echo "Error uploading file";
    exit;
    }

    if(!get_magic_quotes_gpc()) {

    $fileName = addslashes($fileName);
    $filePath = addslashes($filePath);

    }

    $sql = "INSERT INTO media SET
            path = '$filePath',
            size = '$fileSize',
            ftype = '$fileType',
            fname = '$fileName'";

if (mysql_query($sql)) {
    echo('');
    } else {
        echo('<p style="color: #ff0000;">Error adding audio: ' . mysql_error() . '</p><br />');
}

и ваш HTML-код будет;

<form action="<?php $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data"">
      <input type="hidden" name="MAX_FILE_SIZE" value="2000000">
      <input type="file" class="file_input" name="userfile" />
      <input type="submit" value="" name="submit" id="submitStatus" class="submit" />
    </form>
1 голос
/ 27 апреля 2009
  1. почему бы не использовать in_array вместо цикла foreach для проверки типа?
  2. при загрузке действительного файла вы пытались проверить значения $ sizeOK & $ typeOK
1 голос
/ 26 апреля 2009

Вы никогда не должны предполагать, что значение в $ _FILES [...] ['type'] фактически соответствует типу файла. Клиент может отправить любую произвольную строку, и она вообще не проверяется PHP. Смотрите здесь .

Вы должны будете выполнить работу самостоятельно, чтобы фактически определить, какой тип файла был загружен, если только у вас нет веской причины вообще не заботиться о безопасности (чего, вероятно, нет). PHP по умолчанию предоставляет пакет fileinfo , который делает тяжелую работу за вас. Смотрите finfo_file () .

0 голосов
/ 26 апреля 2009

Вот код, который даст вам некоторое символическое значение для ваших ошибок:

class UploadException extends Exception { 
    public function __construct($code) { 
        $message = $this->codeToMessage($code); 
        parent::__construct($message, $code); 
    } 

    private function codeToMessage($code) { 
        switch ($code) { 
            case UPLOAD_ERR_INI_SIZE: 
                $message = "The uploaded file exceeds the upload_max_filesize directive in php.ini"; 
                break; 
            case UPLOAD_ERR_FORM_SIZE: 
                $message = "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"; 
                break; 
            case UPLOAD_ERR_PARTIAL: 
                $message = "The uploaded file was only partially uploaded"; 
                break; 
            case UPLOAD_ERR_NO_FILE: 
                $message = "No file was uploaded"; 
                break; 
            case UPLOAD_ERR_NO_TMP_DIR: 
                $message = "Missing a temporary folder"; 
                break; 
            case UPLOAD_ERR_CANT_WRITE: 
                $message = "Failed to write file to disk"; 
                break; 
            case UPLOAD_ERR_EXTENSION: 
                $message = "File upload stopped by extension"; 
                break; 

            default: 
                $message = "Unknown upload error"; 
                break; 
        } 
        return $message; 
    } 
} 

// Use 
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) { 
    //uploading successfully done 
} else { 
    throw new UploadException($_FILES['file']['error']); 
}

Если вы получили ошибку из вашего последнего оператора else, трудно сказать, что именно вызвало ее. Попробуйте использовать что-то вроде выше. http://www.php.net/manual/en/features.file-upload.errors.php

0 голосов
/ 26 апреля 2009

Возможно, проблема в 5 МБ.

...