Pregunta sobre file-upload, php – PHP auto incrementa nombres de archivos

3

Tengo un cargador de archivos y quiero que los nombres de los archivos se incrementen automáticamente. No siento la necesidad de usar una base de datos para hacer esto y quiero mantener el código relativamente limpio, soy bastante nuevo en la carga y administración de archivos en PHP, así que no estoy exactamente seguro de qué hacer. ¿Podría alguien dirigirme en el camino correcto?

Aquí está mi código actual, solo usa un md5 de un montón de semillas.

<?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;
}
?>
es una mala idea NO verificar el éxito / fracaso de la carga, también es una mala idea no verificar las colisiones de nombres de archivos, ya que está reduciendo la longitud del hash a 20 caracteres; ha aumentado considerablemente las posibilidades de una colisión. Marc B

Tu respuesta

4   la respuesta
2

Solo puede tener un archivo de texto básico en la carpeta dada. Guarde el número allí. Léalo y auméntelo según sea necesario.

Sería más fácil hacer una función como getNextNumber () que hiciera lo anterior y luego podría usarla según sea necesario. También podría hacer esto en una variable $ _SERVER [], pero tendría que volver a cargarse desde el archivo al reiniciar el servidor.

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

?>

Tenga en cuenta que si usa mucho esto, necesitará un generador de secuencias más avanzado, ya que esto realizará 2 IO de archivo en cada llamada.

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

Solo cuenta todos los archivos .png en el directorio, incrementa ese número en 1 y lo usa como su nombre de archivo.

Tenga en cuenta que si está almacenando una gran cantidad de archivos (por ejemplo, 10.000s), es más rápido usar el método de Joseph Lusts, pero de lo contrario esto funcionará de manera justa.

Sin embargo, algo picante. No garantiza que dos subidas paralelas no se completen al mismo tiempo, obtenga el mismo conteo y luego una sobrescriba la otra. Marc B
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;
}

este código es bastante antiguo (ni siquiera usa mysqli), pero pensé que lo incluiría primero

<?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("");
}
?>
1

Puedes probar el siguiente código. Crea un archivo con extensión .png y nombre único en 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;
}

Preguntas relacionadas