图片上传问题

时间:2010-12-26 15:42:50

标签: php image upload

我写了一个调整大小和上传图片的功能......它可以工作,但只适用于一个图像。因此,如果我将该函数调用三次,最终会得到最后一张图像的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 个答案:

答案 0 :(得分:1)

使用当前时间确定文件的结果名称。函数执行速度非常快,time()会为两个图像产生相同的结果。

使用其他方法消除文件结果名称的歧义。最好的选择是将结果名称作为参数传递。这样,环境可以确定文件的命名方式。候选者是元信息的主键(如果它们存储在数据库中),原始文件名,通用唯一标识符。

在任何情况下,请检查结果名称是否为您平台上的合法文件名,并且不会意外覆盖文件。

还要考虑使用move_uploaded_file将文件从临时位置移动到目标位置。该函数进行了一些安全检查。

答案 1 :(得分:0)

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