[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Загрузка изображения
okiro
Ниже приведен скрипт написанный мною. Он обрабатывает изображения, если оно проходит все проверки, то создается копия с уменьшенным разрешением и имя файла хранится в массиве, чтобы потом вставить в MySQL.

Интересно было бы узнать, какие еще проверки необходимы или какие могут быть уязвимости.

п.с. просто привык писать комментарии на английском smile.gif

PHP
<?php
if ($_FILES)
{
//------------------------------------------------------------------------------
$imUploadedIndex = array();
$filename = array();
$ext = array();
$imageArray = array();

$maxImageToUpload 6;
// -----------------------------------------------------------------------------
// ------------------------- Image Upload Validation ---------------------------
// -----------------------------------------------------------------------------
for ($i=0;$i<count($_FILES['image']['error']) &&  $i<$maxImageToUpload;$i++)
{
    
$imError $_FILES['image']['error'][$i];
    switch (
$imError)
    {
        case 
0:
            
$imUploadedIndex[] = $i;
            break;
        case 
1:
            die(
"Image size is more than 2 mb");
            break;
        case 
4:
            break;
        default:
            echo 
"Error uploading number: $imError";
    }
}
if (
count($imUploadedIndex)==0// Check if there any uploaded files;
{
    die(
"No uploaded files");
}
foreach (
$imUploadedIndex as $index//Checking for uploaded file or not
{
    if (!
is_uploaded_file($_FILES['image']['tmp_name'][$index]))
    {
        die(
'Not uploaded file');
    }
}
foreach (
$imUploadedIndex as $index// Checking for file extension
{

    switch (
substr($_FILES['image']['name'][$index],-3))
    {
        case 
"jpg":
            break;
        default:
            die(
'Image has invalid extension for image file');
    }
}
foreach (
$imUploadedIndex as $index//Checking for file type
{
    
$imageType $_FILES['image']['type'][$index];
    switch(
$imageType)
    {
        case 
"image/pjpeg":
            
$ext[] = "jpg";
            break;
        case 
"image/jpeg":
            
$ext[] = "jpg";
            break;
        default:
            die (
"Image type is not supported");
    }
}
foreach (
$imUploadedIndex as $index//Checking for image dimensions
{
    
$imageOriginal imagecreatefromjpeg($_FILES['image']['tmp_name'][$index]);
    
$imWidth imagesx($imageOriginal); // Oginial Image Width
    
$imHeight imagesy($imageOriginal); // Original Image Height
    
if ($imWidth 640 || $imHeight 480)
    {
        die(
"Image dimensions are less than 640x480 px");
    }
    
imagedestroy($imageOriginal);
}
// -----------------------------------------------------------------------------
$i 0;
foreach (
$imUploadedIndex as $index//Creating filenames
{
    
$imageOriginal imagecreatefromjpeg($_FILES['image']['tmp_name'][$index]);
    
$imWidth imagesx($imageOriginal); // Oginial Image Width
    
$imHeight imagesy($imageOriginal); // Original Image Height

    
$newImage imagecreatetruecolor(640,480); //New blank image
    
imagecopyresampled($newImage,$imageOriginal,0,0,0,0,640,480,$imWidth,$imHeight);

    
$unique md5(uniqid(mt_rand()));
    
$filename "img/autos/".$unique.".".$ext[$i];
    
$i+=1;

    
imagejpeg($newImage,$filename,75);
    
$imageArray[] = $filename;
}

for (
$i=0;$i<$maxImageToUpload;$i++) //Filling blank keys with NULL value
{
    if (!
array_key_exists($i,$imageArray))
    {
        
$imageArray[$i] = NULL;
    }
}
// -----------------------------------------------------------------------------

//------------------------------------------------------------------------------
}




Спустя 30 минут, 34 секунды (24.10.2009 - 13:04) Joker написал(а):
PHP
foreach()

не советую использовать этот цикл он очень очень тихий а у тебя их 5.....

Спустя 41 минута, 31 секунда (24.10.2009 - 13:46) twin написал(а):
Цитата
не советую использовать этот цикл он очень очень тихий

неправда.

okiro
следи за этим разделом.

Спустя 1 час, 53 минуты, 17 секунд (24.10.2009 - 15:39) Joker написал(а):
Цитата (twin @ 24.10.2009 - 16:46)
неправда.


Как не правда, во первых ты сам мне это говорил во вторых я сам убеждался уже не раз....

Спустя 12 минут, 16 секунд (24.10.2009 - 15:51) twin написал(а):
Я где то читал про это. Но потом засомневался и провел ряд тестов. Серьёзно отстает по скорости while. А for и foreach работают почти одинаково. for чуть быстрее, но не на столько, что бы пренебрегать удобством.

Спустя 4 минуты, 14 секунд (24.10.2009 - 15:56) Joker написал(а):
Цитата (twin @ 24.10.2009 - 18:51)
А for и foreach работают почти одинаково. for чуть быстрее, но не на столько, что бы пренебрегать удобством.


Я тож тестил foreach тише for где то 1,7 раз. Но это средний результат.

Спустя 16 минут, 35 секунд (24.10.2009 - 16:12) twin написал(а):
Тут смотря как тестить. Вот смотри, такой тест показывает, что фореч быстрее(!) чем фор аж в 2,5 раза. smile.gif

PHP
<?php
$arr 
= range(0,1000000);

define("START_TIME", microtime(true));

foreach(
$arr as $b)
$a += $b;

printf("Время выполнения: %.5f с", microtime(true) - START_TIME);


PHP
<?php
$arr 
= range(0,1000000);

define("START_TIME", microtime(true));

$cnt = count($arr);
for(
$i = 0; $i < $cnt; ++$i)
$a += $arr[$i];

printf("Время выполнения: %.5f с", microtime(true) - START_TIME);

Спустя 2 часа, 45 минут, 33 секунды (24.10.2009 - 18:58) kirik написал(а):
На больших массивах лучше использовать while вместо foreach, потому как foreach создает в памяти копию массива и работает с ней, тоесть на момент прохождения цикла памяти отъедается в 2 раза больше. На маленьких массивах, конечно foreach удобнее smile.gif

Спустя 57 минут, 20 секунд (24.10.2009 - 19:55) twin написал(а):
Ну тут речь про скорость))) а while реально медленнее всех (аж в 9 раз!). По этому наверно всетаки for оптимальнее для массивов. А на маленьких фореч уж больно удобен. smile.gif


Спустя 14 минут, 45 секунд (24.10.2009 - 20:10) kirik написал(а):
Цитата (twin @ 24.10.2009 - 11:55)
По этому наверно всетаки for оптимальнее для массивов. А на маленьких фореч уж больно удобен.

Скажем так:
foreach удобен для небольших ассоциативных или индексных массивов:
PHP
$arr = array(...);
foreach(
$arr as $val)
// ---
foreach($arr as $key => $val)


for удобен для больших индексных массивов:
PHP
$arr = array(...);
for(
$i = 0, $c = count($arr); $i < $c; $i++)
// ---
// for(; list($key, $val) = each($arr);) // - некрасиво


while будет смотреться симпотичнее чем (for) для ассоциативных (по скорости они с for почти одинаковы):
PHP
$arr = array(...);
while(list(
$key, $val) = each($arr)) // - красиво


ЗЫ. конечно же после использования each() нужно применить к массиву reset(), чтобы не произошло недоразумений

Спустя 28 минут, 9 секунд (24.10.2009 - 20:38) twin написал(а):
Цитата
(по скорости они с for почти одинаковы):

Ну у меня упрямо не так... Очень сильно while проигрывает в скорости
PHP
<?php 
$arr 
= range(0,1000000);

define("START_TIME", microtime(true));

while(list(
$b) = each($arr))
$a += $b;

printf("Время выполнения: %.5f с", microtime(true) - START_TIME);

Спустя 9 минут, 52 секунды (24.10.2009 - 20:48) kirik написал(а):
PHP
$arr = range(0,100000);
$a = 0;
$start = microtime(true);

// 0.12062 с
for(; list(, $b) = each($arr);)
{
    $a += $b;
}
printf("Время выполнения for: %.5f с", microtime(true) - $start);

reset($arr);
$a = 0;
$start = microtime(true);
// 0.12044 с
while(list(, $b) = each($arr))
{
    $a += $b;
}
printf("\nВремя выполнения while: %.5f с", microtime(true) - $start);

точнее так

Спустя 13 минут, 55 секунд (24.10.2009 - 21:02) twin написал(а):
Блин, интересно в чем прикол...
PHP
<?php 
$arr 
range(0,100000);
$a 0;
$start microtime(true);

// 0.04376 с
$cnt count($arr);
for(
$i 0$i $cnt; ++$i)
$a += $arr[$i];

printf("Время выполнения for: %.5f с"microtime(true) - $start);

reset($arr);
$a 0;
$start microtime(true);

// 2.07561 c
while(list(, $b) = each($arr))
    
$a += $b;

printf("\nВремя выполнения while: %.5f с"microtime(true) - $start);

Спустя 1 минута, 19 секунд (24.10.2009 - 21:03) twin написал(а):
А с листом как у тебя фор дольше smile.gif

Спустя 12 минут, 11 секунд (24.10.2009 - 21:15) twin написал(а):
Вот так наверное самый корректный тест. Но все равно while терпит поражение. А фореч самый быстрый почему то теперь)))
PHP
<?php 
$arr 
range(0,100000);
$a 0;
$start microtime(true);

$cnt count($arr);
for(
$i 0$i $cnt; ++$i)
$a += $arr[$i];

printf("Время выполнения for: %.5f с"microtime(true) - $start);

reset($arr);
$a 0;
$start microtime(true);

$cnt count($arr);
$i 0;
while(
$i $cnt)
{
    
$a += $arr[$i];
    ++
$i;
}

printf("<br>\nВремя выполнения while: %.5f с"microtime(true) - $start);

reset($arr);
$a 0;
$start microtime(true);

$cnt count($arr);
foreach(
$arr as $b)
$a += $b;

printf("<br>\nВремя выполнения foreach: %.5f с"microtime(true) - $start);


Цитата
Время выполнения for: 0.06798 с
Время выполнения while: 0.08422 с
Время выполнения foreach: 0.01702 с

Спустя 37 минут, 12 секунд (24.10.2009 - 21:53) kirik написал(а):
Цитата (twin @ 24.10.2009 - 13:15)
Но все равно while терпит поражение. А фореч самый быстрый почему то теперь)))

Похоже разница в скоростях довольно сильно от процессора/системы зависит, результаты на amd64 (linux 64 бит):
Цитата
Время выполнения for: 0.03892 с
Время выполнения while: 0.03728 с
Время выполнения foreach: 0.02868 с

где-то всего в 1.5 раза foreach быстрее, в то время как у тебя в 6-8 раз.. huh.gif

Спустя 1 день, 16 часов, 25 минут, 47 секунд (26.10.2009 - 15:18) okiro написал(а):
Цитата (twin @ 24.10.2009 - 10:46)
okiro
следи за этим разделом.

А разве еще можно принимать участие?

Спустя 33 минуты, 48 секунд (26.10.2009 - 15:52) Gabriel написал(а):
okiro
следить и принимать разные веши

Спустя 21 минута, 26 секунд (26.10.2009 - 16:14) glock18 написал(а):
kirik
а откуда инфа, что форич копирует массив целиком? насколько я знаю, он при прохождении по нему копирует элементы в переменные value и key, но не сам массив. Кстати то, что форич быстрее мне объясняет как раз то, что с ним не приходится скакать по массиву с итератором. форич сам планомерно передвигает указатель, и все. а фор и вайл обращаются к элементам по индексу (копирования нет), а значит (не факт, конечно), что допустим оверхед за счет того, что массивы нетипизированы. Считай, размер всех элементов разный. И для того чтобы перейти к 1000му элементу, возможно, требуется несколько больше, чем просто передвинуть указатель.

ЗЫ:
1. более чем уверен, что результаты тестов не будут подтверждены при другом раскладе.

2. тесты не сказать, чтобы верны. каждый цикл должен замеряться независимо. состояние памяти на момент начала обработки может иметь значение.

3. в общем, забить и юзать то, что удобней. smile.gif

Спустя 1 час, 31 минута, 50 секунд (26.10.2009 - 17:45) twin написал(а):
Цитата
А разве еще можно принимать участие?

В конкурсе уже нет, но в рамках задачи вне конкурса можешь подать заявку. Тогда разберем по косточкам.
Только по тем условиям, что там есть.

Спустя 5 минут, 51 секунда (26.10.2009 - 17:51) twin написал(а):
Цитата
2. тесты не сказать, чтобы верны. каждый цикл должен замеряться независимо.

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

Спустя 8 минут, 5 секунд (26.10.2009 - 17:59) glock18 написал(а):
twin
так а откуда такие данные, что форич делает полную копию массива?

попрохождению он каждый элемент по очередно копирует.ну да это все равно что в while написать

PHP
while ($var $arr[$i++])


просветишь ? smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.