Create Unique Image Names

前端 未结 15 2105
暗喜
暗喜 2021-01-06 08:02

What\'s a good way to create a unique name for an image that my user is uploading?

I don\'t want to have any duplicates so something like MD5($filename) isn\'t suita

相关标签:
15条回答
  • 2021-01-06 08:27

    For good performance and uniqueness you can use approach like this:

    • files will be stored on a server with names like md5_file($file).jpg

    • the directory to store file in define from md5 file name, by stripping first two chars (first level), and second two (second level) like that:

      uploaded_files\ 30 \ c5 \ 30 c5 67139b64ee14c80cc5f5006d8081.pdf

    • create record in database with file_id, original file name, uploaded user id, and path to file on server

    • on server side create script that'll get role of download providing - it'll get file by id from db, and output its content with original filename provided by user (see php example of codeigniter download_helper ). So url to file will look like that:

      http://site.com/download.php?file=id


    Pros:

    • minified collisions threat

    • good performance at file lookup (not much files in 1 directory, not much directories at the same level)

    • original file names are saved

    • you can adjust access to files by server side script (check session or cookies)

    Cons:

    • Good for small filesizes, because before user can download file, server have to read this file in memory
    0 讨论(0)
  • 2021-01-06 08:28

    Grab the file extension from uploaded file:

    $ext = pathinfo($uploaded_filename, PATHINFO_EXTENSION);
    

    Grab the time to the second: time()

    Grab some randomness: md5(microtime())

    Convert time to base 36: base_convert (time(), 10, 36) - base 36 compresses a 10 byte string down to about 6 bytes to allow for more of the random string to be used

    Send the whole lot out as a 16 char string:

    $unique_id = substr( base_convert( time(), 10, 36 ) . md5( microtime() ), 0, 16 ) . $ext;
    

    I doubt that will ever collide - you could even not truncate it if you don't mind very long file names.

    0 讨论(0)
  • 2021-01-06 08:28

    Something like this could work for you:

    while (file_exists('/uploads/' . $filename . '.jpeg')) {
       $filename .= rand(10, 99);
    }
    
    0 讨论(0)
  • 2021-01-06 08:30

    as it was mentioned, i think that best way to create unique file name is to simply add time(). that would be like

    $image_name = time()."_".$image_name;
    
    0 讨论(0)
  • 2021-01-06 08:32

    How big is the probablity of two users uploading image with same name on same microsecond ?

    try

        $currTime = microtime(true);
        $finalFileName = cleanTheInput($fileName)."_".$currTime;
    
    // you can also append a _.rand(0,1000) in the end to have more foolproof name collision
    
        function cleanTheInput($input)
        {
         // do some formatting here ...
        }
    

    This would also help you in tracking the upload time of the file for analysis. or may be sort the files,manage the files.

    0 讨论(0)
  • 2021-01-06 08:33

    http://php.net/manual/en/function.uniqid.php maybe?

    • You can prefix it with the user id to avoid collisions between 2 users (in less than one millisecond).
    0 讨论(0)
提交回复
热议问题