У меня есть файловый загрузчик, и я хочу, чтобы имена файлов автоматически увеличивались. Я не чувствую необходимости использовать базу данных для этого, и я хочу, чтобы код был относительно чистым, я довольно новичок в загрузке и управлении файлами на PHP, поэтому я не совсем уверен, что делать. Может ли кто-нибудь направить меня на правильный путь?
Вот мой текущий код, он просто использует md5 из кучи семян.
<?php if(isset($_FILES['imagedata']['tmp_name'])) { // Directory related to the location of your gyazo script $newName = 'images/' . substr(md5(rand() . time()), 0, 20) . '.png'; $tf = fopen($newName, 'w'); fclose($tf); move_uploaded_file($_FILES['imagedata']['tmp_name'], $newName); // Website echo 'http://davidknag.com/' . $newName; } ?>
<?php if(isset($_FILES['imagedata']['tmp_name'])) { // Directory related to the location of your gyazo script $fileCount = count (glob ('images/*.png')); $newName = 'images/' . ( $fileCount + 1) . '.png'; $tf = fopen($newName, 'w'); fclose($tf); move_uploaded_file($_FILES['imagedata']['tmp_name'], $newName); // Website echo 'http://davidknag.com/' . $newName; }
Он просто учитывает все .png-файлы в каталоге, увеличивает это число на 1 и использует это как его имя файла.
Обратите внимание, что если вы храните очень большой объем файлов (скажем, 10.000 секунд), быстрее использовать метод Джозефа Люста, но в противном случае это будет работать jus tfine.
Вы можете просто иметь базовый текстовый файл в данной папке. Сохраните номер там. Прочитайте его и при необходимости увеличьте.
Было бы проще сделать такую функцию, как getNextNumber (), которая сделала бы это, а затем вы могли бы использовать ее по мере необходимости. Вы также можете сделать это в переменной $ _SERVER [], но ее необходимо перезагрузить из файла при перезапуске сервера.
<?PHP // a basic example function getNextNumber() { $count = (int)file_get_contents('yourFile.txt'); $count+=1; file_put_contents('yourFile.txt',$count); return $count; } ?>
Обратите внимание, что если вы используете это много, вам понадобится более продвинутый генератор последовательности, поскольку он будет выполнять 2 файла ввода-вывода для каждого вызова.
Вы можете попробовать код ниже. Он создает файл с расширением .png и уникальным именем в outdir /
$filename = uniqFile('outdir', '.png'); move_uploaded_file($_FILES['imagedata']['tmp_name'], $filename); function uniqFile($dir, $ext) { if (substr($dir, -1, 1) != '/') { $dir .= '/'; } for ($i=1; $i<999999; $i++) { if (!is_file($dir . $i . $ext)) { return $i . $ext; } } return false; }
function enc($length = "string") { if(!is_numeric($length) || $length > 255 || $length < 1){ $length = rand("3","6"); } // $randomID = substr(uniqid(sha1(crypt(md5("".time("ysia", true)."".rand())))), 0, $length); $randomID = genUnique($length); $count = 0; while(glob("$randomID.*") || fetch("select * from `short` where `short` = '$randomID'") || fetch("select * from `images` where `name` = '$randomID'") || glob("img/$randomID.*") || is_numeric($randomID)){ if($count > 20){ $length++; } $randomID = genUnique($length); $count++; } return $randomID; }
этот код довольно старый (даже не используя mysqli), но я решил, что сначала включу его
<?php include_once "functions.php"; if(!isset($_REQUEST['api'])){ notfound(""); } $con = connect(); $key = $_REQUEST['api']; $ver = $_REQUEST['version']; if($ver != "10-26-2016" || $key == "zoidberg") { die("Please upgrade your in4.us.exe by logging in and clicking download."); } if($key == "nokey"){ die("You need to keep the exe with the ini file to pair your api key. Copy ini file to same directory or redownload."); } $key = mysql_real_escape_string($key); $findkey = fetch(" SELECT * from `users` where `key` = '$key' "); if(!is_array($findkey)){ die("No user with that API Key found. Configure the INI File using your api key on in4.us"); } $user = $findkey['username']; if(isset($_FILES['imagedata']['tmp_name'])){ $newName = enc(); $tf = fopen("img/".$newName.".png", 'w'); fclose($tf); move_uploaded_file($_FILES['imagedata']['tmp_name'], "img/".$newName.".png"); $domain = $_SERVER['HTTP_HOST']; date_default_timezone_set('America/New_York'); $mysqldate = date("Ymd H:i:s"); $qry = mysql_query("INSERT INTO `images` (`name`, `added`, `dateadded`) VALUES ('$newName', '$user', '$mysqldate');"); if(!qry){ die('Invalid query: ' . mysql_error()); } echo "http://$domain/$newName.png"; disconnect($con); }else{ notfound(""); } ?>