Rename image name uploaded

Asked

Viewed 10,283 times

0

I’m using the resize-class to upload images, resize and other options if necessary.

My only problem is that I want to rename the image when uploading, so that there are no images with the same name and even for privacy reasons.
I wish something like:

time(). uniqid(md5());

I just want to do it this way and it’s already great, I wish an easy way to change the name of the image, I saw something like $_FILES['file']['tmp_name'] however, I’m not succeeding this way.
Below is the code of the page where I am uploading and registering in the BD

add_product.php

<?php 
include_once("funcao/resize-class.php");

if(isset($_POST['foto-cadastrada'])):

    $idproduto = $_POST['id'];

    $caminho = "imagens/produtos/";
    $imagem = $_FILES['imagemupload']['name'];


        if(move_uploaded_file($_FILES['imagemupload']['tmp_name'], $caminho . $imagem)){ 
            // Cria tamanhos necessários
            $resize_tamanho1 = new resize($caminho . $imagem);
            $resize_tamanho2 = new resize($caminho . $imagem);

            // Define as medidas que cada tamanho irá ter
            $resize_tamanho1->resizeImage(320, 240, 'auto');
            $resize_tamanho2->resizeImage(640, 480, 'auto');

            // Renomeia imagem para que seja possivel o mesmo nome ter vários tamanhos
            $tamanho1 = "tamanho1_".$imagem;
            $tamanho2 = "tamanho2_".$imagem;

            //Define o caminho, o nome e a qualidade
            $resize_tamanho1->saveImage($caminho . $tamanho1, 100);
            $resize_tamanho2->saveImage($caminho . $tamanho2, 100);

            //apaga imagem original
            unlink($caminho . $imagem);
        }

        $cadastrando = $conn->prepare("INSERT INTO fotos_produtos (id_produto, arquivo, posicao) VALUES (?, ?, ?) ");
        $cadastrando->execute(array($idproduto, $imagem, 0));

        header("Location: add_produto.php?adicionar-fotos&id=$idproduto");

endif;
?>

resize-class.php

<?php
Class resize {

    // *** Class variables
    private $image;
    private $width;
    private $height;
    private $imageResized;

    function __construct($fileName) {
        // *** Open up the file
        $this->image = $this->openImage($fileName);

        // *** Get width and height
        $this->width = imagesx($this->image);
        $this->height = imagesy($this->image);
    }

    ## --------------------------------------------------------

    private function openImage($file) {
        // *** Get extension
        $extension = strtolower(strrchr($file, '.'));

        switch ($extension) {
            case '.jpg':
            case '.jpeg':
                $img = @imagecreatefromjpeg($file);
                break;
            case '.gif':
                $img = @imagecreatefromgif($file);
                break;
            case '.png':
                $img = @imagecreatefrompng($file);
                break;
            default:
                $img = false;
                break;
        }
        return $img;
    }

    ## --------------------------------------------------------

    public function resizeImage($newWidth, $newHeight, $option = "auto") {
        // *** Get optimal width and height - based on $option
        $optionArray = $this->getDimensions($newWidth, $newHeight, $option);

        $optimalWidth = $optionArray['optimalWidth'];
        $optimalHeight = $optionArray['optimalHeight'];


        // *** Resample - create image canvas of x, y size
        $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
        imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height);


        // *** if option is 'crop', then crop too
        if ($option == 'crop') {
            $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
        }
    }

    ## --------------------------------------------------------

    private function getDimensions($newWidth, $newHeight, $option) {

        switch ($option) {
            case 'exact':
                $optimalWidth = $newWidth;
                $optimalHeight = $newHeight;
                break;
            case 'portrait':
                $optimalWidth = $this->getSizeByFixedHeight($newHeight);
                $optimalHeight = $newHeight;
                break;
            case 'landscape':
                $optimalWidth = $newWidth;
                $optimalHeight = $this->getSizeByFixedWidth($newWidth);
                break;
            case 'auto':
                $optionArray = $this->getSizeByAuto($newWidth, $newHeight);
                $optimalWidth = $optionArray['optimalWidth'];
                $optimalHeight = $optionArray['optimalHeight'];
                break;
            case 'crop':
                $optionArray = $this->getOptimalCrop($newWidth, $newHeight);
                $optimalWidth = $optionArray['optimalWidth'];
                $optimalHeight = $optionArray['optimalHeight'];
                break;
        }
        return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
    }

    ## --------------------------------------------------------

    private function getSizeByFixedHeight($newHeight) {
        $ratio = $this->width / $this->height;
        $newWidth = $newHeight * $ratio;
        return $newWidth;
    }

    private function getSizeByFixedWidth($newWidth) {
        $ratio = $this->height / $this->width;
        $newHeight = $newWidth * $ratio;
        return $newHeight;
    }

    private function getSizeByAuto($newWidth, $newHeight) {
        if ($this->height < $this->width) {
        // *** Image to be resized is wider (landscape)
            $optimalWidth = $newWidth;
            $optimalHeight = $this->getSizeByFixedWidth($newWidth);
        } elseif ($this->height > $this->width) {
        // *** Image to be resized is taller (portrait)
            $optimalWidth = $this->getSizeByFixedHeight($newHeight);
            $optimalHeight = $newHeight;
        } else {
        // *** Image to be resizerd is a square
            if ($newHeight < $newWidth) {
                $optimalWidth = $newWidth;
                $optimalHeight = $this->getSizeByFixedWidth($newWidth);
            } else if ($newHeight > $newWidth) {
                $optimalWidth = $this->getSizeByFixedHeight($newHeight);
                $optimalHeight = $newHeight;
            } else {
                // *** Sqaure being resized to a square
                $optimalWidth = $newWidth;
                $optimalHeight = $newHeight;
            }
        }

        return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
    }

    ## --------------------------------------------------------

    private function getOptimalCrop($newWidth, $newHeight) {

        $heightRatio = $this->height / $newHeight;
        $widthRatio = $this->width / $newWidth;

        if ($heightRatio < $widthRatio) {
            $optimalRatio = $heightRatio;
        } else {
            $optimalRatio = $widthRatio;
        }

        $optimalHeight = $this->height / $optimalRatio;
        $optimalWidth = $this->width / $optimalRatio;

        return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
    }

    ## --------------------------------------------------------

    private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight) {
        // *** Find center - this will be used for the crop
        $cropStartX = ( $optimalWidth / 2) - ( $newWidth / 2 );
        $cropStartY = ( $optimalHeight / 2) - ( $newHeight / 2 );

        $crop = $this->imageResized;
        //imagedestroy($this->imageResized);
        // *** Now crop from center to exact requested size
        $this->imageResized = imagecreatetruecolor($newWidth, $newHeight);
        imagecopyresampled($this->imageResized, $crop, 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight, $newWidth, $newHeight);
    }

    ## --------------------------------------------------------

    public function saveImage($savePath, $imageQuality = "100") {
        // *** Get extension
        $extension = strrchr($savePath, '.');
        $extension = strtolower($extension);

        switch ($extension) {
            case '.jpg':
            case '.jpeg':
                if (imagetypes() & IMG_JPG) {
                    imagejpeg($this->imageResized, $savePath, $imageQuality);
                }
                break;

            case '.gif':
                if (imagetypes() & IMG_GIF) {
                    imagegif($this->imageResized, $savePath);
                }
                break;

            case '.png':
                // *** Scale quality from 0-100 to 0-9
                $scaleQuality = round(($imageQuality / 100) * 9);

                // *** Invert quality setting as 0 is best, not 9
                $invertScaleQuality = 9 - $scaleQuality;

                if (imagetypes() & IMG_PNG) {
                    imagepng($this->imageResized, $savePath, $invertScaleQuality);
                }
                break;

            // ... etc

            default:
                // *** No extension - No save.
                break;
        }

        imagedestroy($this->imageResized);
    }

    ## --------------------------------------------------------
}

?>
  • You just want to know how to rename the image after upload?

  • I want to rename the image while uploading only. In the case after the upload no longer serves because it may have replaced one with the same name.

3 answers

2


On the line

$imagem = $_FILES['imagemupload']['name'];

Subistitua by:

$extensao = pathinfo($_FILES['imagemupload']['name']);
$extensao = ".".$extensao['extension'];
$imagem = time().uniqid(md5()).$extensao;

This way the name would be changed as in the example below:

minha-imagem.jpg
140321309553a355277399b.jpg
  • I got error "syntax error, Unexpected '[' probably related to ['Extension']

  • I keep getting the same mistake, though, if you put ['extension'] within the pathinfo it works but has array at the end of the file name.

  • No problem, I’m testing it anyway several ways, but it continues with the same mistake, I’ve tried to make some adaptations but the mistake is still: Parse error: syntax error, unexpected '[' in C:\wamp\www\site\administracao\add_produto.php on line 12 You tried to test the code using the class resize-class.php ?

  • PHP 5.3 on the server and locally PHP Version 5.3.5

  • So that’s it, the use of [] in the function itself is only possible in version 5.4 or higher.

  • Now the error is hidden, but does not take the file extension and does not load it to the folder. tamanho1_140321402453a358c829d8c.

  • @Tiagoboeing the first line was with a logic error, adjusted and now everything should work correctly.

  • Now yes, this way is also very practical, thanks for the answer. I put another way to solve the problem too.

  • That answer helped me a lot to solve a big problem I had, thank you @Kazzkiq.

Show 4 more comments

2

Adaptation to the class:

Way to Solve Extension Related Problem.

$nomeimagem = $_FILES['imagemupload']['name'];  
$ext = strrchr($nomeimagem, '.'); 
$imagem = time().uniqid(md5()).$ext;

File name: size1_140321501253a35ca4b95b9.jpg

After searching I found the function strrchr, it performs a search for a given character and returns what is after it. (great for the extension problem by picking up what comes after the point)

And if the image name has dot (.) ?

I tested this possibility and however I did not get problems, she ignored the point . present in the file name and kept taking only the extension.

2

Hi. I use the following methods to upload images:

function upload($foto){

    $erro = $config = array();

    // Prepara a variável do arquivo
    $arquivo = isset($foto) ? $foto : FALSE;

    // Tamanho máximo do arquivo (em bytes)
    $config["tamanho"] = 306883;

    // Largura minimo (pixels)
    $config["largura"] = 150;

    // Altura minima (pixels)
    $config["altura"]  = 50;

    // Formulário postado... executa as ações

    if ($arquivo) {
        // Verifica se o mime-type do arquivo é de imagem
        if (!eregi("^image\/(pjpeg|jpeg)$", $arquivo["type"])) {

            $erro[] = "Arquivo em formato inválido! A imagem deve ser jpg ou jpeg. Envie outro arquivo";

        } else {

            // Verifica tamanho do arquivo
            if ($arquivo["size"] > $config["tamanho"]) {

                $erro[] = "Arquivo em tamanho muito grande! A imagem deve ser de no máximo " . $config["tamanho"] . " bytes. Envie outro arquivo";

            }

            // Para verificar as dimensões da imagem
            $tamanhos = getimagesize($arquivo["tmp_name"]);

            // Verifica largura
            if ($tamanhos[0] < $config["largura"]) {

                $erro[] = "Largura da imagem deve ser superior a " . $config["largura"] . " pixels";

            }

            // Verifica altura
            if ($tamanhos[1] < $config["altura"]) {

                $erro[] = "Altura da imagem deve superior a " . $config["altura"] . " pixels";

            }

        }

        // Imprime as mensagens de erro
        if (sizeof($erro)) {

            foreach ($erro as $err) {

                $msg .= " - ".$err."\\n";

            }

            print "<script>alert('$msg')</script>";

        }

        // Verificação de dados OK, nenhum erro ocorrido, executa então o upload...
        else {

            // Pega extensão do arquivo
            //          preg_match("/\.(jpg|jpeg){1}$/i", $arquivo["name"], $ext);

            // Gera um nome único para a imagem
            $imagem_nome = intval($this->codecs) . "anuncio.jpg";

            // Caminho de onde a imagem ficará

            $imagem_dir = "../tecbiz/figuras/logos/" . $imagem_nome;


            // Faz o upload da imagem

            $upload = $this->reduz_imagem($foto["tmp_name"], 250, 130, $imagem_dir);

            // $upload = move_uploaded_file($arquivo["tmp_name"], $imagem_dirGd);

            if ($upload) {

                print "<script>alert('Imagem enviada com sucesso!')</script>";


                return 'ok';

            } else {

                print "<script>alert('Ocorreu um problema com o envio da imagem!')</script>";

            }

        }

    }

}

function reduz_imagem($img, $max_x, $max_y, $nome_foto) {

    list($width, $height) = getimagesize($img);

    $original_x = $width;

    $original_y = $height;

    // se a largura for maior que altura
    if($original_x > $original_y) {

        $porcentagem = (100 * $max_x) / $original_x;

    }

    // se a altura for maior que a largura
    else {

        $porcentagem = (100 * $max_y) / $original_y;

    }

    $tamanho_x = $original_x * ($porcentagem / 100);

    $tamanho_y = $original_y * ($porcentagem / 100);

    $image_p = imagecreatetruecolor($tamanho_x, $tamanho_y);

    $image = imagecreatefromjpeg($img);

    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $tamanho_x, $tamanho_y, $width, $height);

    return imagejpeg($image_p, $nome_foto, 100);

}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.