Pergunta sobre php, file-upload – Nomes de arquivos de incremento automático do PHP

3

Eu tenho um uploader de arquivo e eu quero que os nomes de arquivo para o número de incremento automático. Eu não sinto a necessidade de usar um banco de dados para fazer isso e eu quero manter o código relativamente limpo, eu sou muito novo no upload e gerenciamento de arquivos em PHP, então não sei exatamente o que fazer. Alguém poderia me direcionar no caminho certo?

Aqui está o meu código atual, ele usa apenas um md5 de um monte de sementes.

<?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;
}
?>
má idéia de não verificar o sucesso / fracasso do upload, também é uma má ideia não verificar as colisões de nome de arquivo, já que você está reduzindo o tamanho do hash para 20 caracteres - você aumentou consideravelmente as chances de uma colisão. Marc B

Sua resposta

4   a resposta
2

Armazene o número lá. Leia e incremente conforme necessário.

Seria mais fácil fazer uma função como getNextNumber () que fez o acima e, em seguida, você poderia usá-lo conforme necessário. Você também pode fazer isso em uma variável $ _SERVER [], mas ela precisa ser recarregada a partir do arquivo na reinicialização do servidor.

<?PHP
// a basic example
function getNextNumber() {
    $count = (int)file_get_contents('yourFile.txt');
    $count+=1;
    file_put_contents('yourFile.txt',$count);
    return $count;
}

?>

Observe que, se você estiver usando muito, precisará de um gerador de sequência mais avançado, pois isso executará dois IOs de arquivo em cada chamada.

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;
}

mas eu imaginei incluí-lo primeiro

<?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
<?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;
}

incrementa esse número em 1 e usa isso como seu nome de arquivo.

Note que se você está armazenando uma grande quantidade de arquivos (digamos 10.000s), é mais rápido usar o método de Joseph Lusts, mas caso contrário isso funcionará bem.

Um pouco atrevido, no entanto. Não há garantias de que dois uploads paralelos não sejam concluídos ao mesmo tempo, obtenham a mesma contagem e, em seguida, um substitua o outro. Marc B
1

nome exclusivo em 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;
}

Perguntas relacionadas