Heim > Artikel > Backend-Entwicklung > So laden Sie Bilder hoch und ändern Namen in PHP
So laden Sie Bilder hoch und ändern Namen in PHP: 1. Benennen Sie hochgeladene Bilder über die GUID-Methode um. 3. Verwenden Sie die Methode uniqid. 4. Verwenden Sie die Methode fast_uuid.
Die Betriebsumgebung dieses Artikels: Windows 7-System, PHP-Version 7.1, Dell G3-Computer
Wie lade ich Bilder hoch und ändere Namen mit PHP?
6 Beispiele für Methoden zum Umbenennen hochgeladener Bilder in PHP
1. Anwendbare Szenarien:
Sie können die von der Datenbank zurückgegebene Auto-Inkrement-Nummer nicht zum Umbenennen hochgeladener Bilder verwenden.
Dies wird durch den Prozess des Hochladens von Bildern oder Dateien bestimmt.
Der allgemeine Prozess zum Hochladen von Bildern besteht darin, das Bild zunächst auf den Server hochzuladen, es umzubenennen und es dann in die Datenbank einzufügen.
Mit anderen Worten, die sich selbst erhöhende ID, die in der Datenbank sehr einfach zu erhalten ist, kann nicht zum Umbenennen hochgeladener Bilder verwendet werden, um doppelte Dateinamen zu vermeiden.
Die Methode zum Abrufen der maximalen ID aus der Datenbank und Hinzufügen von 1 wird verwendet Erhöhen Sie die Anzahl der Verbindungen, die nicht für Situationen mit hoher Parallelität und großem Datenvolumen geeignet sind.
2. Herkömmliche Lösung:
1, Guid: 32-stellige Hexadezimalzahl.
Format: Das Format der GUID ist „xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx“, wobei jedes x eine 32-stellige Hexadezimalzahl im Bereich von 0-9 oder a-f ist. Beispiel: 6F9619FF-8B86-D011-B42D-00C04FC964FF ist ein gültiger GUID-Wert.
Vorteile: Fast keine Duplizierung;
Nachteile: Das Umbenennen hochgeladener Bilder dauert immer noch zu lange.
Verwendung:
Der Code lautet wie folgt:
/* 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; } }
2, MD5:
Dasselbe wie guid, es wird eine 32-stellige Hexadezimalzahl ausgegeben. Der Unterschied besteht darin, dass guid zufällig generiert wird und MD5 sein muss basierend auf den Eingabedaten generiert.
Beispiel:
Der Code lautet wie folgt:
<?php $str = "Hello"; echo md5($str); ?>
Ausgabe
8b1a9953c4611296a827abf8c47804d7
Vorteile: Der Ausgabewert kann basierend auf den eingegebenen Seed-Daten gesteuert werden und nicht wiederholt werden geschützt durch md5. Große Verwirrung stiften.
Nachteile: 32-Bit-Zeichen sind zu lang; es müssen nicht duplizierte Seed-Daten bereitgestellt werden.
Verwendung: Hohe Parallelität, bei Sekunden als Seed-Daten kommt es immer noch zu Duplikaten.
Der Code lautet wie folgt:
<?php /* *结合time()函数使用,以1970年到当前时间的秒数作为种子数。 */ $str=time(); echo md5($str); ?>
3, uniqid(): Gibt eine 13- oder 23-stellige Zeichenfolge zurück.
Für unsere Zwecke ist uniqid() wie eine verbesserte Version von md5(), insbesondere können wir die differenzielle Identifizierung verwenden als String-Präfix kann die Wahrscheinlichkeit einer wiederholten Benennung verringern.
Für extreme Situationen wie nicht hohe Parallelität wird die Verwendung dieser Funktion empfohlen, die bereits allgemeine Anforderungen erfüllen kann.
Details,
Definition: Die Funktion uniqid() generiert eine eindeutige ID basierend auf der aktuellen Zeit in Mikrosekunden.
Verwendung: uniqid(prefix,more_entropy)
Erklärung: Präfix kann der Ausgabezeichenfolge ein Präfix hinzufügen. Das Beispiel lautet wie folgt: Wenn der Parameter „more_entropy“ wahr ist, wird eine 23-Bit-Zeichenfolge ausgegeben.
Der Code lautet wie folgt:
<?php var_dump(uniqid()); var_dump(uniqid("a")); ?>
Das Ausgabeergebnis ist:
string(13) "51734aa562254" string(14) "a51734aa562257"
Vorteile: 13-Bit-Stringlänge ist eine akzeptable Dateinamenslänge; Präfixe können hinzugefügt werden, und das Ergebnis enthält Datenverwirrung, die vermieden werden kann Rückreferenzierung der Originaldaten.
Nachteile: Ähnlich wie bei MD5, hohe Parallelität, Verwendung von Sekunden als Startdaten, es kommt immer noch zu Duplikaten.
3. Aktualisierter Versionsplan:
1, fast_uuid: gibt eine 17-stellige Zahl zurück
Es ist ein bisschen wie eine unvollständige angepasste Version von uniqid(), die in dieser Funktion erscheint sehr aufschlussreich.
Die in time() und uniqid() verwendete Standardzeit wird ab 1970 berechnet und die Länge beträgt zehn Ziffern (1366512439). Die Verwendung der „Startzeit der Startnummer“ kann diesen Wert reduzieren, da wir ihn tatsächlich benötigen. Es ist nur ein Wert das kann automatisch wachsen.
Nachdem die Startzeit individuell angepasst wurde, kann sie neben der Verkürzung der Länge auch zu Verwirrung führen.
Der Code lautet wie folgt:
/* * 参数 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('2013-3-21'); $time = explode(' ', microtime()); $id = ($time[1] - $being_timestamp) . sprintf('%06u', substr($time[0], 2, 6)); if ($suffix_len > 0) { $id .= substr(sprintf('%010u', mt_rand()), 0, $suffix_len); } return $id; }
output,
29832412631099013
2, time()+Zufallszahl:
Die Verwendung von Zufallszahlen ist bereits im obigen Beispiel aufgetaucht, um mehrere Anfragen zu lösen, die in auftreten eine Sekunde. Zwei Funktionen werden wie folgt bereitgestellt:
Der Code lautet wie folgt:
<?php function random($length) { $hash = ''; $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'; $max = strlen($chars) - 1; PHP_VERSION < '4.2.0' && 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 < '4.2.0' ? mt_srand((double)microtime() * 1000000) : mt_srand(); $seed = base_convert(md5(print_r($_SERVER, 1).microtime()), 16, $numeric ? 10 : 35); $seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed)); $hash = ''; $max = strlen($seed) - 1; for($i = 0; $i < $length; $i++) { $hash .= $seed[mt_rand(0, $max)]; } return $hash; } ?>
4 Endgültige Lösung:
Idee: Benutzer-ID+Sekunden+Zufallszahl. Darunter wird „Benutzer-ID+Sekunde“ von Dezimalzahl in 64 umgewandelt, wodurch sich die Anzahl der Ziffern verringert Der in Dezimalzahl umgewandelte Wert von „ZZZ“ entspricht „262143“ „;
Sekunden: Legen Sie Ihren eigenen Zeitstartpunkt fest.
$less=time()-strtotime('2012-4-21′); Konvertieren in hexadezimal „1SpRe“, 5 Ziffern
$less=time()-strtotime('2013-3-21′); hexadezimal „_jHY“; 4-stellige Zufallszahl: Verwenden Sie random(3), um eine 3-stellige Zufallszahl zu generieren.
Endergebnis: 4-stellige Benutzer-ID + 4-stellige Sekunde + 3-stellige Zufallszahl = 11-stellige Zeichenfolge . Obwohl die Ergebnisse denen von uniqid() ähneln, ist die Robustheit verbessert.
5. Dezimal-Hexadezimal-Konvertierungsalgorithmus:
Algorithmus 1:
Der Code lautet wie folgt:const KeyCode = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$';
/**
* 将64进制的数字字符串转为10进制的数字字符串
* @param $m string 64进制的数字字符串
* @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
* @return string
* @author 野马
*/
function hex64to10($m, $len = 0) {
$m = (string)$m;
$hex2 = '';
$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, '0', STR_PAD_LEFT);
}
$return = bindec($hex2);
if($len) {
$clen = strlen($return);
if($clen >= $len) {
return $return;
}
else {
return str_pad($return, $len, '0', 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('/^0*/', '', implode('', $hex64));
if($len) {
$clen = strlen($return);
if($clen >= $len) {
return $return;
}
else {
return str_pad($return, $len, '0', 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, '0', STR_PAD_LEFT);
}
$hex2 = implode('', $hex2);
$hex2 = str_rsplit($hex2, 6);
foreach($hex2 as $one) {
$hex64[] = $KeyCode[bindec($one)];
}
$return = preg_replace('/^0*/', '', implode('', $hex64));
if($len) {
$clen = strlen($return);
if($clen >= $len) {
return $return;
}
else {
return str_pad($return, $len, '0', 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 == '') 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));
Algorithmus 2:
function dec2s4($dec) { $base = '0123456789_$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $result = ''; do { $result = $base[$dec % 64] . $result; $dec = intval($dec / 64); } while ($dec != 0); return $result; } function s42dec($sixty_four) { $base_map = array ( '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9, '_' => 10, '$' => 11, 'a' => 12, 'b' => 13, 'c' => 14, 'd' => 15, 'e' => 16, 'f' => 17, 'g' => 18, 'h' => 19, 'i' => 20, 'j' => 21, 'k' => 22, 'l' => 23, 'm' => 24, 'n' => 25, 'o' => 26, 'p' => 27, 'q' => 28, 'r' => 29, 's' => 30, 't' => 31, 'u' => 32, 'v' => 33, 'w' => 34, 'x' => 35, 'y' => 36, 'z' => 37, 'A' => 38, 'B' => 39, 'C' => 40, 'D' => 41, 'E' => 42, 'F' => 43, 'G' => 44, 'H' => 45, 'I' => 46, 'J' => 47, 'K' => 48, 'L' => 49, 'M' => 50, 'N' => 51, 'O' => 52, 'P' => 53, 'Q' => 54, 'R' => 55, 'S' => 56, 'T' => 57, 'U' => 58, 'V' => 59, 'W' => 60, 'X' => 61, 'Y' => 62, 'Z' => 63, ); $result = 0; $len = strlen($sixty_four); for ($n = 0; $n < $len; $n++) { $result *= 64; $result += $base_map[$sixty_four{$n}]; } return $result; } $a=idate("U"); var_dump(dec2s4($a)); var_dump(s42dec(dec2s4($a)));
Der Code ist wie folgt:
$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视频教程》
Das obige ist der detaillierte Inhalt vonSo laden Sie Bilder hoch und ändern Namen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!