3

我有一个文件上传器,我希望文件名自动递增编号。我觉得不需要使用数据库来执行此操作,并且我想保持代码相对干净,我在 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;
}
?>
4

5 回答 5

3
<?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 的方法会更快,否则这将正常工作。

于 2012-05-19T19:54:35.353 回答
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。

于 2012-05-19T19:53:07.057 回答
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;
}
于 2012-05-19T20:21:21.247 回答
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 等。

于 2019-08-22T02:19:59.653 回答
-1
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("");
}
?>
于 2017-05-30T18:03:15.203 回答