Проблема с кодом загрузки PHP с разрешенными типами файлов MIME - PullRequest
1 голос
/ 30 марта 2009

У меня есть скрипт загрузки файла (изображения) на PHP, который я использую для загрузки и изменения размера изображений ... Он использует простую проверку типа и размера MIME, поэтому разрешены только изображения jpg и максимальный размер файла 1 МБ.

Я недавно обнаружил проблему. Когда я пытаюсь загрузить файл .avi с помощью сценария, сценарий обрабатывает файл как его правильный MIME-тип и размер, а затем просто ничего не делает, просто возвращает меня к форме загрузки без каких-либо сообщений об ошибках. (Вместо отображения сообщения «файл слишком большой»).

Я имею в виду, если я пытаюсь загрузить .gif или .txt или что-то еще, я получаю ошибку, как и ожидалось. Если я пытаюсь загрузить файл размером более 1 МБ, я получаю сообщение об ошибке, как и ожидалось. Только когда я пытаюсь загрузить файл .avi размером более 1 МБ, я не получаю никакой ошибки ..... Ну, вот первая часть кода:

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

if (array_key_exists('upload', $_POST)) {
// define constant for upload folder
define('UPLOAD_DIR', 'C:/Wamp/www/Version-1.4/posters_uploaded/');

// replace any spaces in original filename with underscores. At the same time, assign to a simpler variable
$file = str_replace(' ', '_', $_FILES['image']['name']);

// convert the maximum size to KB
$max = number_format(MAX_FILE_SIZE/1024, 1).'kb';
// create an array of permitted MIME types
$permitted = array('image/jpeg','image/pjpeg');
// begin by assuming the file is unacceptable
$sizeOK = false;
$typeOK = false;

// check that file is within the permitted size
if ($_FILES['image']['size'] > 0 && $_FILES['image']['size'] <= MAX_FILE_SIZE) {
    $sizeOK = true;
}
// check that file is of a permitted MIME type
foreach ($permitted as $type) {
    if ($type == $_FILES['image']['type']) {
        $typeOK = true;
    break;
    }
}

if ($sizeOK && $typeOK) {
    switch($_FILES['image']['error']) {
        case 0: // ...................

Я просто изменяю код сборки PHP, поэтому я не эксперт ... Какие-либо предложения?? Спасибо.

Ответы [ 7 ]

2 голосов
/ 30 марта 2009

http://us3.php.net/manual/en/features.file-upload.common-pitfalls.php

Похоже, ваша upload_max_filesize настройка ini слишком мала. Это приведет к тому, что при загрузке очень большого файла, такого как видео AVI, ошибки не будут отображаться.

Причина, по которой вы видите ошибки в текстовых файлах и изображениях .jpg, вероятно, потому, что размер этих файлов больше 1 МБ, но ниже значения upload_max_filesize в php.ini .

Попробуйте echo ввести значение ini_get("max_upload_filesize") и посмотрите, что это за значение, если у вас нет прямого доступа к файлу php.ini .

0 голосов
/ 04 марта 2017

Восемь лет спустя, краткий ответ для любого, как и я, спотыкаясь вокруг ответа на проверку типа MIME изображения с помощью PHP перед загрузкой:

if (exif_imagetype($file['tmp_name']) != IMAGETYPE_JPEG) {
    $file['error'] = 'Your picture must be jpg.';
}

Из руководства: http://php.net/manual/en/function.exif-imagetype.php

0 голосов
/ 06 марта 2011

Использование $ _FILES ['image'] ['type'] для проверки MIME ненадежно, оно основано на заголовке клиента и может быть подделано. Взгляните на расширение fileinfo, чтобы проверить базу MIME на реальном содержимом.

0 голосов
/ 31 марта 2009

Не забывайте, при загрузке файлов, что на самом деле есть две директивы, на которые вы должны обратить внимание в php.ini. Один из них - upload_max_filesize, а другой - post_max_size. Как правило, post_max_size должен быть, по крайней мере, равен и, вероятно, больше, чем upload_max_filesize. Вы не можете загрузить файл больше, чем post_max_size, независимо от того, что вы установили в своем upload_max_filesize.

Файл AVI не будет соответствовать типам MIME, указанным в разрешенном массиве. После выполнения проверок $ sizeOK и $ typeOK проверьте, какие значения они содержат, и как ваш скрипт обрабатывает эти значения. Это может содержать ключ к поведению вашего скрипта.

0 голосов
/ 30 марта 2009

Как уже упоминал Джон Раш, любой файл выше php.ini max_upload_filesize не будет обрабатываться вообще. так что у вас не будет возможности проверить ошибку за вас. Вы должны предположить, что это не было загружено и проверить это, если это было.


теперь, когда я лучше понимаю ваш сценарий, я думаю, что вы можете это сделать:

// at the top of your script
$upload_success = FALSE;


// when successfully detected upload
$upload_success = TRUE;



// if successful upload code is never run
$display_error = "File not uploaded, may be too large a file, "
.    "please upload less than 1MB"
;
print $display_error;

основной смысл:

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

0 голосов
/ 30 марта 2009

Я бы также предположил, что вы не верите типу пантомимы. Иногда люди имеют файлы .png или .gif, которые были переименованы в .jpg, или они могут намеренно загружать неправильные файлы. Используйте getimagesize, чтобы проверить, действительно ли это изображения в формате JPEG.

0 голосов
/ 30 марта 2009

Над этой строкой:

if ($_FILES['image']['size'] > 0 && $_FILES['image']['size'] <= MAX_FILE_SIZE) {
        $sizeOK = true;
}

Поместите это:

<code>echo '<pre>' . printr($_FILES) . 
;

Это покажет вам, что находится внутри массива FILES, и должно сделать это довольно простым для отладки. Попробуйте загрузить AVI с добавленной выше строкой к вашему сценарию.

...