проблема загрузки изображения - PullRequest
0 голосов
/ 26 декабря 2010

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

function uploadImage($name,$width,$height,$size,$path='content/user_avatars/')
{
    //===================================================
    //Handle image upload
    $upload_error=0;
    //Picture
    $img = $_FILES[$name]['name'];
    if($img)
    {
        $file = stripslashes($_FILES[$name]['name']);
        $ext = strtolower(getExt($file));

        if($ext!='jpg' && $ext!='jpeg' && $ext!='png' && $ext!='gif')
        {
            $error_msg = "Unknown extension";
            $upload_error = 1;
            return array($upload_error,$error_msg);
        }

        if(filesize($_FILES[$name]['tmp_name'])>$size*1024)
        {
            $error_msg = "Max file size of ".($size*1024)."kb exceeded";
            $upload_error = 2;
            return array($upload_error,$error_msg);
        }

        $newFile = time().'.'.$ext;

        resizeImg($_FILES[$name]['tmp_name'],$ext,$width,$height);
        $store = copy($_FILES[$name]['tmp_name'],$path.$newFile);
        if(!$store)
        {
            $error_msg = "Uploading failed";
            $upload_error = 3;
            return array($upload_error,$error_msg);
        }
        else
        {
            return array($upload_error,$newFile);
        }
    }
}

//=========================================================================================

//Helper Functions
function getExt($str)
{
    $i = strpos($str,".");
    if(!$i)
    {
        return "";
    }
    $l = strlen($str)-$i;
    $ext = substr($str,$i+1,$l);
    return $ext;
}

function resizeImg($file,$ext,$width,$height)
{
    list($aw,$ah) = getimagesize($file);
    $scaleX = $aw/$width;
    $scaleY = $ah/$height;

    if($scaleX>$scaleY)
    {
        $nw = round($aw*(1/$scaleX));
        $nh = round($ah*(1/$scaleX));
    }
    else
    {
        $nw = round($aw*(1/$scaleY));
        $nh = round($ah*(1/$scaleY));
    }


    $new_image = imagecreatetruecolor($nw,$nh);
    imagefill($new_image,0,0,imagecolorallocatealpha($new_image,255,255,255,127));
    if($ext=='jpg'||$ext=='jpeg')
    {
        $src_image = imagecreatefromjpeg($file);
    }
    else if($ext=='gif')
    {
        $src_image = imagecreatefromgif($file);
    }
    else if($ext=='png')
    {
        $src_image = imagecreatefrompng($file);
    }
    imagecopyresampled($new_image,$src_image,0,0,0,0,$nw,$nh,$aw,$ah);

    if($ext=='jpg'||$ext=='jpeg')
    {
        imagejpeg($new_image,$file,100);
    }
    else if($ext=='gif')
    {
        imagegif($new_image,$file);
    }
    else if($ext=='png')
    {
        imagepng($new_image,$file,9);
    }

    imagedestroy($src_image);
    imagedestroy($new_image);
}

У меня есть форма с двумя полями для загрузки, face_pic и body_pic, и я хочу загрузить эти два файла на сервер и изменить их размер перед сохранением. Есть идеи?

Ответы [ 2 ]

1 голос
/ 26 декабря 2010

Вы используете текущее время, чтобы определить результирующее имя файла. Функция выполняется так быстро, что time() дает одинаковый результат для обоих изображений.

Используйте некоторые другие средства для устранения неоднозначности полученного имени файла. Лучший выбор - передать полученное имя в качестве параметра. Таким образом, среда может определить, как будет назван файл. Кандидаты являются первичным ключом метаинформации (если они хранятся в базе данных), оригинальным именем файла, универсально уникальным идентификатором.

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

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

0 голосов
/ 26 декабря 2010
md5(microtime())

Попробуйте назвать это так.

Или попробуйте что-то вроде этого ...

function slikeAvatar($slika,$id = 0){
    copy($slika, "avatari/{$id}l.jpg");
    $gfx = new Thumbnail($slika, 200);
    $gfx->save("avatari/{$id}.jpg");
    unset($gfx);
    $gfx = new Thumbnail($slika, 75);
    $gfx->save("avatari/{$id}s.jpg");
    unset($gfx);
    slikeCrop("avatari/{$id}s.jpg","avatari/{$id}s.jpg"); 
}

slike = images

...