我有一个文件上传器,我希望文件名自动增加数字。我不觉得有必要使用数据库来做这件事,我想保持代码相对干净,我在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;
}
?>
答案 0 :(得分:4)
<?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秒),那么使用Joseph Lusts的方法会更快,但除此之外,这将非常有效。
答案 1 :(得分:2)
您可以在给定文件夹中拥有基本文本文件。将号码存储在那里。读出来并根据需要增加它。
最简单的方法是使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个文件IO。
答案 2 :(得分:1)
您可以尝试以下代码。它在outdir /
中创建扩展名为.png且唯一名称的文件$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;
}
答案 3 :(得分:0)
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("Y-m-d 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("");
}
?>
答案 4 :(得分:0)
在游戏中稍晚一些,但是这对函数可以解决问题,并遵循熟悉的文件名格式,后跟“(n)”,然后是文件扩展名:
incrementFileName()返回带有输入文件名和目标目录的更新文件名,该文件名以1递增。 splitLast()是对explode的修改,只在最后一次出现某些子字符串时才进行拆分。
function incrementFileName($name,$path){
if (!array_search($name,scandir($path))) {
return $name;
} else {
$ext=splitLast($name,".")[1];
$baseFileName=splitLast(splitLast($name,".")[0],"(")[0];
$num=intval(splitLast(splitLast($name,"(")[1],")")[0])+1;
return incrementFileName($baseFileName."(".$num.").".$ext,$path);
}
}
function splitLast($string,$delim) {
$parts = explode($delim, $string);
if (!$parts || count($parts) === 1) {
$before=$string;
$after="";
} else {
$after = array_pop($parts);
$before=implode($delim, $parts);
}
return array($before,$after);
}
处理上传文件时,设置文件名:
$fileName = incrementFileName($_FILES['file']['name'], $path);
这将返回someFileName(1).jpg或someFileName(2).jpg等。