Rumah >pembangunan bahagian belakang >masalah PHP >Bagaimana untuk memuat naik gambar dan menukar nama dalam php

Bagaimana untuk memuat naik gambar dan menukar nama dalam php

藏色散人
藏色散人asal
2021-09-16 10:46:553834semak imbas

Cara memuat naik imej dan menukar nama dalam PHP: 1. Namakan semula imej yang dimuat naik melalui kaedah GUID; 2. Gunakan kaedah MD5; 4. Gunakan kaedah fast_uuid, dsb.

Bagaimana untuk memuat naik gambar dan menukar nama dalam php

Persekitaran pengendalian artikel ini: sistem Windows 7, PHP versi 7.1, komputer Dell G3

Cara memuat naik gambar dan tukar nama dalam php?

6 contoh kaedah untuk menamakan semula imej yang dimuat naik dalam PHP

1 Senario yang berkenaan:
tidak boleh digunakan daripada pangkalan data Nombor peningkatan automatik yang dikembalikan digunakan untuk menamakan semula imej yang dimuat naik.
Ini ditentukan oleh proses memuat naik imej atau fail.
Proses muat naik imej umum adalah untuk memuat naik imej ke pelayan, menamakan semula, dan kemudian memasukkannya ke dalam pangkalan data.
Maksudnya, ID yang meningkat sendiri yang sangat mudah diperoleh dalam pangkalan data tidak boleh digunakan untuk menamakan semula gambar yang dimuat naik untuk mengelakkan pertindihan nama fail
Sebaliknya, ID maksimum tambah 1 diperoleh daripada pangkalan data. , meningkatkan bilangan sambungan pangkalan data, dan tidak sesuai untuk situasi dengan konkurensi tinggi dan volum data yang besar; .
Format: GUID adalah dalam format "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", dengan setiap x ialah nombor perenambelasan 32 digit dalam julat 0-9 atau a-f. Contohnya: 6F9619FF-8B86-D011-B42D-00C04FC964FF ialah nilai GUID yang sah. Kelebihan: Hampir tiada penduaan;
Kelemahan: Masih terlalu lama untuk menamakan semula gambar yang dimuat naik.
Penggunaan:


Kodnya adalah seperti berikut:

2, MD5:

akan mengeluarkan nombor heksadesimal 32 aksara seperti guid, perbezaan Panduan dijana secara rawak, dan md5 perlu dijana berdasarkan data input.
/*
    com_create_guid()是php5版本支持的功能,对于不支持的版本,可以自己进行定义;
*/
function guid(){
   if (function_exists('com_create_guid')){
       return com_create_guid();
   }else{
       mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
       echo(mt_rand());
       $charid = strtoupper(md5(uniqid(rand(), true)));
       $hyphen = chr(45);// "-"
       $uuid = chr(123)// "{"
               .substr($charid, 0, 8).$hyphen
               .substr($charid, 8, 4).$hyphen
               .substr($charid,12, 4).$hyphen
               .substr($charid,16, 4).$hyphen
               .substr($charid,20,12)
               .chr(125);// "}"
       return $uuid;
   }
}
Contoh:



Kod adalah seperti berikut:

Output

<?php
$str = "Hello";
echo md5($str);
?>


Kelebihan: Boleh berdasarkan pada data benih input Untuk mengawal nilai output, jika data benih adalah tetap dan tidak berulang, data boleh dilindungi melalui md5, yang akan menyebabkan kekeliruan yang besar.

Kelemahan: aksara 32-bit terlalu panjang; data benih bukan pendua perlu disediakan;
8b1a9953c4611296a827abf8c47804d7


Kodnya adalah seperti berikut:


3, uniqid(): Mengembalikan rentetan 13 atau 23 digit

Untuk tujuan kami, uniqid() adalah seperti md5( ), terutamanya kita boleh menggunakan pengecam pembezaan sebagai awalan rentetan, yang boleh mengurangkan peluang penamaan berulang.

Untuk situasi yang melampau seperti konkurensi tidak tinggi, adalah disyorkan untuk menggunakan fungsi ini, yang sudah boleh memenuhi keperluan umum.

Butiran,
<?php
/*
*结合time()函数使用,以1970年到当前时间的秒数作为种子数。
*/
$str=time();
echo md5($str);
?>
Definisi: Fungsi uniqid() menjana ID unik berdasarkan masa semasa dalam mikrosaat.

Penggunaan: uniqid(prefix,more_entropy)
Penjelasan: awalan boleh menambah awalan pada rentetan output Contohnya adalah seperti berikut Apabila parameter more_entropy adalah benar, rentetan 23-bit akan dikeluarkan.


Kodnya adalah seperti berikut:


Hasil output ialah:

<?php
var_dump(uniqid());
var_dump(uniqid("a"));
?>
Kelebihan: panjang rentetan 13-bit, fail yang boleh diterima Panjang bernama awalan boleh ditambah, dan hasilnya mengandungi kekeliruan data untuk mengelakkan merujuk semula data asal.

Kelemahan: Sama seperti md5, konkurensi tinggi, menggunakan saat sebagai data benih, pertindihan masih akan berlaku.

3. Pelan versi ditingkatkan:
string(13) "51734aa562254" string(14) "a51734aa562257"

1, fast_uuid: mengembalikan 17 digit
Ia agak seperti versi tersuai yang tidak lengkap bagi "masa mula nombor benih" itu muncul dalam fungsi ini "Konsep ini memberi inspirasi.
Masa lalai yang digunakan dalam time() dan uniqid() dikira dari tahun 1970, dan panjangnya ialah sepuluh digit (1366512439) Menggunakan "masa mula nombor benih" boleh mengurangkan nilai ini, kerana kita sebenarnya memerlukan Ya hanyalah nilai yang boleh berkembang secara automatik. Selepas menyesuaikan masa mula, selain mengurangkan panjang, ia juga boleh memainkan peranan dalam kekeliruan.

Kod adalah seperti berikut:


output,

/*
* 参数 suffix_len指定 生成的 ID 值附加多少位随机数,默认值为 3。
* 感谢“Ivan Tan|谭俊青 DrinChing (at) Gmail.com”提供的算法。
* @param int suffix_len
* @return string
*/
function fast_uuid($suffix_len=3){
    //! 计算种子数的开始时间
    $being_timestamp = strtotime(&#39;2013-3-21&#39;);
    $time = explode(&#39; &#39;, microtime());
    $id = ($time[1] - $being_timestamp) . sprintf(&#39;%06u&#39;, substr($time[0], 2, 6));
    if ($suffix_len > 0)
    {
        $id .= substr(sprintf(&#39;%010u&#39;, mt_rand()), 0, $suffix_len);
    }
    return $id;
}
2, masa() nombor rawak:

Dalam contoh di atas, ia telah Penggunaan nombor rawak muncul untuk menyelesaikan pelbagai permintaan yang berlaku dalam satu saat. Dua fungsi disediakan seperti berikut,

29832412631099013
Kod adalah seperti berikut:



4. Penyelesaian akhir

:

Idea: userid seconds random nombor. Antaranya, "userid seconds" ditukar daripada perpuluhan kepada 64, mengurangkan bilangan digit
<?php
function random($length) {
    $hash = &#39;&#39;;
    $chars = &#39;ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz&#39;;
    $max = strlen($chars) - 1;
    PHP_VERSION < &#39;4.2.0&#39; && mt_srand((double)microtime() * 1000000);
    for($i = 0; $i < $length; $i++) {
        $hash .= $chars[mt_rand(0, $max)];
    }
    return $hash;
}
function random2($length, $numeric = 0) {
    PHP_VERSION < &#39;4.2.0&#39; ? mt_srand((double)microtime() * 1000000) : mt_srand();
    $seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35);
    $seed = $numeric ? (str_replace(&#39;0&#39;, &#39;&#39;, $seed).&#39;012340567890&#39;) : ($seed.&#39;zZ&#39;.strtoupper($seed));
    $hash = &#39;&#39;;
    $max = strlen($seed) - 1;
    for($i = 0; $i < $length; $i++) {
        $hash .= $seed[mt_rand(0, $max)];
    }
    return $hash;
}
?>
Penerangan:

userid: Nilai maksimum "ZZZZ" dalam 64 ditukar kepada perpuluhan bersamaan dengan "16777215", dan nilai maksimum "ZZZ" ditukar kepada perpuluhan Nilai adalah sama dengan "262143"; Saat: Tetapkan titik permulaan masa anda sendiri. $less=time()-strtotime('2012-4-21′); Tukarkan kepada heksadesimal "1SpRe", 5 digit
$less=time()-strtotime('2013-3-21′) ; Tukar kepada heksadesimal "_jHY"; 4-digit
nombor rawak: gunakan rawak(3) untuk menjana nombor rawak 3-digit:
4-digit userid 4-digit saat 3- digit nombor rawak =11 digit rentetan. Walaupun hasilnya kelihatan serupa dengan uniqid(), kekukuhannya dipertingkatkan.

5. Algoritma untuk menukar perpuluhan kepada heksadesimal:

Algoritma 1:

Kodnya adalah seperti berikut:

Algoritma 2:

Kod adalah seperti berikut:

const KeyCode = &#39;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$&#39;;
    /**
     * 将64进制的数字字符串转为10进制的数字字符串
     * @param $m string 64进制的数字字符串
     * @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
     * @return string
     * @author 野马
     */
    function hex64to10($m, $len = 0) {
        $m = (string)$m;
        $hex2 = &#39;&#39;;
        $Code = KeyCode;
        for($i = 0, $l = strlen($Code); $i < $l; $i++) {
            $KeyCode[] = $Code[$i];
        }
        $KeyCode = array_flip($KeyCode);
        for($i = 0, $l = strlen($m); $i < $l; $i++) {
            $one = $m[$i];
            $hex2 .= str_pad(decbin($KeyCode[$one]), 6, &#39;0&#39;, STR_PAD_LEFT);
        }
        $return = bindec($hex2);
        if($len) {
            $clen = strlen($return);
            if($clen >= $len) {
                return $return;
            }
            else {
                return str_pad($return, $len, &#39;0&#39;, STR_PAD_LEFT);
            }
        }
        return $return;
    }
    /**
     * 将10进制的数字字符串转为64进制的数字字符串
     * @param $m string 10进制的数字字符串
     * @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
     * @return string
     * @author 野马
     */
    function hex10to64($m, $len = 0) {
        $KeyCode = KeyCode;
        $hex2 = decbin($m);
        $hex2 = str_rsplit($hex2, 6);
        $hex64 = array();
        foreach($hex2 as $one) {
            $t = bindec($one);
            $hex64[] = $KeyCode[$t];
        }
        $return = preg_replace(&#39;/^0*/&#39;, &#39;&#39;, implode(&#39;&#39;, $hex64));
        if($len) {
            $clen = strlen($return);
            if($clen >= $len) {
                return $return;
            }
            else {
                return str_pad($return, $len, &#39;0&#39;, STR_PAD_LEFT);
            }
        }
        return $return;
    }
    /**
     * 将16进制的数字字符串转为64进制的数字字符串
     * @param $m string 16进制的数字字符串
     * @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
     * @return string
     * @author 野马
     */
    function hex16to64($m, $len = 0) {
        $KeyCode = KeyCode;
        $hex2 = array();
        for($i = 0, $j = strlen($m); $i < $j; ++$i) {
            $hex2[] = str_pad(base_convert($m[$i], 16, 2), 4, &#39;0&#39;, STR_PAD_LEFT);
        }
        $hex2 = implode(&#39;&#39;, $hex2);
        $hex2 = str_rsplit($hex2, 6);
        foreach($hex2 as $one) {
            $hex64[] = $KeyCode[bindec($one)];
        }
        $return = preg_replace(&#39;/^0*/&#39;, &#39;&#39;, implode(&#39;&#39;, $hex64));
        if($len) {
            $clen = strlen($return);
            if($clen >= $len) {
                return $return;
            }
            else {
                return str_pad($return, $len, &#39;0&#39;, STR_PAD_LEFT);
            }
        }
        return $return;
    }
    /**
     * 功能和PHP原生函数str_split接近,只是从尾部开始计数切割
     * @param $str string 需要切割的字符串
     * @param $len integer 每段字符串的长度
     * @return array
     * @author 野马
     */
    function str_rsplit($str, $len = 1) {
        if($str == null || $str == false || $str == &#39;&#39;) return false;
        $strlen = strlen($str);
        if($strlen <= $len) return array($str);
        $headlen = $strlen % $len;
        if($headlen == 0) {
            return str_split($str, $len);
        }
        $return = array(substr($str, 0, $headlen));
        return array_merge($return, str_split(substr($str, $headlen), $len));
    }
$a=idate("U");
echo "\r\n<br />e:" . hex10to64($a);
echo "\r\n<br />e:" . hex64to10(hex10to64($a));

Ujian kecekapan algoritma:

Kod adalah seperti berikut:

$strarr = array();
$time1 = microtime(true);
for($i = 0; $i < 10000; ++$i) {
     $str = idate("U")+$i;
     $strarr[] = "{$i}->$str\r\n<br>";
 }
 $time2 = microtime(true);
 $time3 = $time2 - $time1;
 $time1 = microtime(true);
 for($i = 0; $i < 10000; ++$i) {
     $str = dec2s4(idate("U")+$i);
    $strarr[] = "{$i}->$str\r\n<br>";
}
$time2 = microtime(true);
echo "\r\n<br />运行10000次用时(秒):" . ($time2 - $time1 - $time3);

测试结果
算法1:0.1687250137329
算法2:0.044965028762817
结论:算法1虽然效率上差一些,但是可以把md5生成的16进制转化为64进制,能够使用在必须使用md5的环境下缩短字符串。
六、总结
本文涉及了上传图片重命名可以能使用的几种方法,其中关键点是使用10进制转换为64进制来进行字符串的缩减。
例如,使用fast_uuid生成的17位数字,转换为64进制仅有7位字符;
具体使用,可以根据自身情况灵活使用,希望对大家有所帮助。

推荐学习:《PHP视频教程

Atas ialah kandungan terperinci Bagaimana untuk memuat naik gambar dan menukar nama dalam php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn