2009-03-30 2 views
1

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

Я недавно обнаружил проблему. Когда я пытаюсь загрузить файл .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-код, поэтому Im no expert ... Любые предложения? Спасибо.

+0

, если вы опубликуйте размер файла avi, который поможет –

+0

Не имеет значения .. Я пытался использовать разные файлы .. между 400 МБ и 800 МБ. – Jonathan

ответ

0

Как указано выше, любой файл выше 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

Проверено php.ini ... У меня ограничение 2MB ... ; Максимально допустимый размер для загруженных файлов. upload_max_filesize = 2M Итак, это не проблема .... – Jonathan

+0

? Я думаю, вы просто продемонстрировали, что это проблема. если ваш avi не находится между 1 и 2 мб, что я сомневаюсь, большинство файлов avi значительно превышают 2 МБ, у нас есть загружаемый флеш-видео, и они установили max до 18 –

+0

Да, мой avi-файл - 600 МБ, и я не хочу разрешать загрузку .. Я хочу ограничение 1 МБ. Почему мне нужно установить максимальный максимум, если я просто хочу 1 МБ лимита? – Jonathan

2

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

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

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

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

+0

Проверено php.ini ... У меня ограничение 2 МБ ... ; Максимально допустимый размер для загружаемых файлов. upload_max_filesize = 2M Итак, это не проблема .... – Jonathan

+0

Максимальный размер 2 ГБ, это то, что вы имели в виду? –

+0

Я хочу не разрешать файлы размером более 1 МБ. Почему мне нужно изменить лимит на 2 МБ ??? – Jonathan

0

Выше этой линии:

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

Put это:

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

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

+0

Должен быть print_r ($ _ FILES), а не printr ($ FILES). – Peter

+0

My bad, исправит это сейчас – karim79

0

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

+0

MIME не проверяет только расширение файла ... Я думаю ... – Jonathan

+0

В браузерах, которые я тестировал, кажется, установлен тип mime, и он основан на расширении файла. Они не делают реальных тестов относительно формата изображения, это слишком сложно. Поверьте мне, я создал системы загрузки для изображений с нуля в PHP. – JAL

0

Не забывайте при загрузке файлов, что на самом деле есть две директивы, на которые вы должны обратить внимание в 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

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

0

Восемь лет спустя, короткий ответ для тех, кто, как и я, спотыкаясь для ответа на проверки типа изображения 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

Смежные вопросы