Codeigniter - The same md5 name on every upload

I have this annoying problem:

Below you will see my messy upload script in which, whenever I upload a video file, I use a md5 function to name it so there are no video files with the same names in my database/folder.

The problem is that when I upload a given file multiple times to the database, it gets stored with the same md5 file name every time. I would really appreciate it if you could help me fix this little bug. I may be tired or something. I tried a hundred different solutions, and nothing fixed it.

Here is my mess:

<?php

class Upload_model extends CI_Model {

    var $gallery_path;
    var $videos_path;
    var $thumbnail;
    var $video_name;
    var $upload_data;
    var $file_name;
    var $name;
    var $videos_folder = "http://localhost/upload/videos/";

    //////////////////////////////


    function Upload_model() {

        parent::__construct();
        $this->videos_path = realpath(APPPATH . '..\videos');
//        $this->returnFromDatabase();
    }

    function do_upload() {

        $name = $_FILES['userfile']['name']; // get file name from form
        $fileNameParts = explode(".", $name); // explode file name to two part
        $fileExtension = end($fileNameParts); // give extension
        $fileExtension = strtolower($fileExtension); // convert to lower case
        $encripted_pic_name = md5($name) . "." . $fileExtension;  // new file name
        $config['file_name'] = $encripted_pic_name; //set file name


        $config = array(
            'allowed_types' => 'avi|mp4|flw|mov',
            'upload_path' => $this->videos_path,
            'file_name' => $encripted_pic_name
        );

        $this->load->library('upload', $config);



        if ($this->upload->do_upload()) {


            $this->upload_data = $this->upload->data(); //Returns array of containing all of the data related to the file you uploaded.
            $this->file_name = $this->upload_data['file_name'];


            $this->getThumbImage('C:\\xampp\\htdocs\\upload\\videos\\' . $encripted_pic_name);


            $insert_data = array(
                'name' => $encripted_pic_name,
                'path' => 'C:\\xampp\\htdocs\\upload\\videos\\' . $encripted_pic_name,
                'thumb_path' => 'C:\\xampp\\htdocs\\upload\\videos\\' . $encripted_pic_name . "_t.jpeg",
                'uploaded_by' => 'admin'
            );

            $this->db->insert('videos', $insert_data); //load array to database 

            redirect('/welcome');
        }
    }

    function getVideoInformation($videoPath) {
        $movie = new ffmpeg_movie($videoPath, false);

        $this->videoDuration = $movie->getDuration();
        $this->frameCount = $movie->getFrameCount();
        $this->frameRate = $movie->getFrameRate();
        $this->videoTitle = $movie->getTitle();
        $this->author = $movie->getAuthor();
        $this->copyright = $movie->getCopyright();
        $this->frameHeight = $movie->getFrameHeight();
        $this->frameWidth = $movie->getFrameWidth();
        $this->pixelFormat = $movie->getPixelFormat();
        $this->bitRate = $movie->getVideoBitRate();
        $this->videoCodec = $movie->getVideoCodec();
        $this->audioCodec = $movie->getAudioCodec();
        $this->hasAudio = $movie->hasAudio();
        $this->audSampleRate = $movie->getAudioSampleRate();
        $this->audBitRate = $movie->getAudioBitRate();
    }

    function getAudioInformation($videoPath) {
        $movie = new ffmpeg_movie($videoPath, false);

        $this->audioDuration = $movie->getDuration();
        $this->frameCount = $movie->getFrameCount();
        $this->frameRate = $movie->getFrameRate();
        $this->audioTitle = $movie->getTitle();
        $this->author = $movie->getAuthor();
        $this->copyright = $movie->getCopyright();
        $this->artist = $movie->getArtist();
        $this->track = $movie->getTrackNumber();
        $this->bitRate = $movie->getBitRate();
        $this->audioChannels = $movie->getAudioChannels();
        $this->audioCodec = $movie->getAudioCodec();
        $this->audSampleRate = $movie->getAudioSampleRate();
        $this->audBitRate = $movie->getAudioBitRate();
    }

    function getThumbImage($videoPath) {
        $movie = new ffmpeg_movie($videoPath, false);
        $this->videoDuration = $movie->getDuration();
        $this->frameCount = $movie->getFrameCount();
        $this->frameRate = $movie->getFrameRate();
        $this->videoTitle = $movie->getTitle();
        $this->author = $movie->getAuthor();
        $this->copyright = $movie->getCopyright();
        $this->frameHeight = $movie->getFrameHeight();
        $this->frameWidth = $movie->getFrameWidth();

        $capPos = ceil($this->frameCount / 4);

        if ($this->frameWidth > 120) {
            $cropWidth = ceil(($this->frameWidth - 120) / 2);
        } else {
            $cropWidth = 0;
        }
        if ($this->frameHeight > 90) {
            $cropHeight = ceil(($this->frameHeight - 90) / 2);
        } else {
            $cropHeight = 0;
        }
        if ($cropWidth % 2 != 0) {
            $cropWidth = $cropWidth - 1;
        }
        if ($cropHeight % 2 != 0) {
            $cropHeight = $cropHeight - 1;
        }

        $frameObject = $movie->getFrame($capPos);


        if ($frameObject) {
            $imageName = $this->file_name . "_t.jpeg";
            $tmbPath = "C:\\xampp\\htdocs\\upload\\videos\\" . $imageName;
            $frameObject->resize(120, 90, 0, 0, 0, 0);
            imagejpeg($frameObject->toGDImage(), $tmbPath);
        } else {
            $imageName = "";
        }


        return $imageName;
    }

}

Answers


For what matters, CI's upload class has a property called encrypt_name. You can set it to true and have your filename encrypted by default without you doing something else. Take a look: http://ellislab.com/codeigniter/user-guide/libraries/file_uploading.html Also, since you are using CI, please use the Upload Class, don't write your own when the one provided from CI is so easy to use.


md5 will always return the same value when used on the same string, so uploading the file with the same name will end up with the same hash, add a random string to the file name

$encripted_pic_name = md5(microtime() . $name) . '.' . $fileExtension

You also need to be aware that clashes can happen with md5() where two different strings will have the same output. I wouldn't worry about this too much though for your needs.


Need Your Help

jQueryMobile pageinit and ajax

jquery-mobile cordova

right now i have this code using phonegap and jquerymobile

google closure geolocation api

clojurescript google-closure-library

Is there a geolocation API part of google closure (ultimately for use in ClojureScript) ?

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.