Avatar billede hewa Nybegynder
04. marts 2007 - 21:05 Der er 24 kommentarer og
1 løsning

Omdøb fil ved upload

Jeg har fundet understående på nettet. Det er ikke optimalt, da det ikke tjekker for flere ting, men det virker da :)

Dog mangler en vigtig funktion for mig, at fil-navnet bliver lavet om, når det uploades.

Alle billeder i mappen skal hedde 1.jpg, 2.gif, 3.gif, 4.jpeg osv. Dvs selve filtypen skal natuligvis være den samme som oprindeligt, man så er der et eller andet der skal læse, hvor langt nummeret er nået i rækken og så lægge én til, dermed skal næste fil hedde 5.et-eller-andet.

Hvordan laver jeg det?

if($_POST[formsent] == "yes") {

if($_FILES['file']['error'] == UPLOAD_ERR_OK) {

$des = "test/";
$name = $_FILES['file']['name'];
while(file_exists($des.$name)) {
$name = explode(".", $name);
$i = count($name);
$i--;
$name = $name[0].time().".".$name[$i];
}

if(move_uploaded_file($_FILES['file']['tmp_name'], $des.$name)) {
print "Filen ".$_FILES['file']['tmp_name']." er nu flyttet til ".$des.$name;
}
else {
print "Der opstod en fejl!";
}

}
Avatar billede jakobdo Ekspert
04. marts 2007 - 21:26 #1
Det er jo lidt af en nød og knække.
Men hvis vi siger du f.eks. har 1.jpg, 2.gif, 3.png og 4.jpg
Så ville jeg først løbe mappen igennem med:

//Indeholder alle billeder...
$images = glob("/path/to/images/{*.jpg,*.gif,*.png,*.jpeg}", GLOB_BRACE);

//Hjælpe array
$temp = array();
foreach($images AS $image)
{
    $info = pathinfo($image);
    $temp[] = $info['filename'];
}

natcasesort($temp);

$lastFileName = end($temp);

$nextFileName = intval($lastFileName) + 1;

echo "Næste fil skal hedde: " . $nextFileName . "<br />";
Avatar billede hewa Nybegynder
04. marts 2007 - 22:08 #2
Den virker, da den fortæller det rigtige tal - men hvordan får jeg den flettet sammen med den kode jeg har i forvejen?

Alt det $name der ligger i filen nu, har jeg vel ikke længere noget at bruge til?
Avatar billede Slettet bruger
04. marts 2007 - 22:17 #3
Hvorfor skal de hedde 1.jpg, 2.jpg osv? Hvad sker der, når du sletter 3.jpg, og du har 100 billeder?
Avatar billede hewa Nybegynder
04. marts 2007 - 22:17 #4
Jeg sidder lige og tænker over det, det var godt nok super flot lavet på så kort tid!!
Avatar billede hewa Nybegynder
04. marts 2007 - 22:32 #5
mercur8, de skal ikke slettes igen, da de skal bruges i forbindelse med nogle historier, hvor man så kan sætte et billede på.
Avatar billede Slettet bruger
04. marts 2007 - 22:39 #6
Men hvorfor skal de navngives sådan. Det virker unødigt bøvlet.
Avatar billede hewa Nybegynder
04. marts 2007 - 23:19 #7
Synes du, det virker bøvlet. Jamen et er faktisk meget smart, da der ikke skal holdes styr på noget, når det oploades og samtidig bliver billederne trukket frem automatisk, den tager dem fra en ende af - dermed er der ikke noget "vedligeholdelse" :)
Avatar billede jakobdo Ekspert
05. marts 2007 - 08:04 #8
NOget i denne stil:

f($_POST[formsent] == "yes")
{
    $des = "test/";

    //Indeholder alle billeder...
    $images = glob("/" . $des . "{*.jpg,*.gif,*.png,*.jpeg}", GLOB_BRACE);

    //Hjælpe array
    $temp = array();
    foreach($images AS $image)
    {
      $info = pathinfo($image);
    $temp[] = $info['filename'];
    }

    natcasesort($temp);

    $lastFileName = end($temp);

    $nextFileName = intval($lastFileName) + 1;

    if($_FILES['file']['error'] == UPLOAD_ERR_OK)
    {
        $info = pathinfo($_FILES['file']['name']);
        $name = $nextFileName . $info['extension'];

        if(move_uploaded_file($_FILES['file']['tmp_name'], $des.$name))
        {
            print "Filen ".$_FILES['file']['tmp_name']." er nu flyttet til ".$des.$name;
        }
        else
        {
            print "Der opstod en fejl!";
        }
    }
}
Avatar billede pondo Nybegynder
05. marts 2007 - 09:33 #9
Hvad med bare at tjekke om filnavn eksisterer, og hvis det gør så smide et 1-tal efter navnet og prøve igen. Eks(ikke testet):


$target_path = "billed_mappe/";

$name = $_FILES['uploadedfile']['name'];

$file_path = $target_path . $name;

while (file_exists($file_path))
{
        print "The file $target_path exists renaming and trying again";
    $ext = substr($file_path, strlen($file_path)-3, 3);
    $file = substr($file_path, 0, strlen($file)-3);
    $file_path = $file . 1 . $ext;
}


if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $file_path))
{
    echo "The file ".  basename( $_FILES['uploadedfile']['name']).
    " has been uploaded";
}
else
{
    echo "There was an error uploading the file, please try again!";
}
Avatar billede jakobdo Ekspert
05. marts 2007 - 10:31 #10
Det giver jo ikke den ønskede virkning.
Hvis vi siger den prøve 1, så vil næste step være 11
og 111 osv...
Han ønsker 1, 2, 3, 4.
Så $file++ vil være en bedre løsning.
Avatar billede hewa Nybegynder
05. marts 2007 - 17:59 #11
jakobdo, der er et eller andet, der laver kage i den. Den kan godt uploade en fil, én fil, og den kommer til at hedde f.eks. 1jpg, altså uden punktum. Samtidig vil den ikke uploade flere filer - medmindre de hedder noget andet til efternavn, så kan den godt lave en ny, der hedder 1gif. Næste gang erstatter den vist bare den, der ligger der i forvejen, da den ikke bygger et nyt nummer på.

Kan du se, hvad der er galt?
- jeg har pillet lidt rundt, men det havde ikke nogen gavnlig effekt :)
Avatar billede hewa Nybegynder
05. marts 2007 - 18:08 #12
Hov, jeg erstattede denne linje:
$name = $nextFileName . $info['extension'];
med:
  $name = $nextFileName.".". $info['extension'];

Så kommer der et punktum med i filnavnet, men den tæller ikke op, der erstatter blot den nr. 1 der ligger der i forvejen.
Avatar billede jakobdo Ekspert
05. marts 2007 - 18:15 #13
Prøv evt. efter: natcasesort($temp);
At kald:
echo '<pre>';
print_r($temp);
echo '</pre>';
Avatar billede hewa Nybegynder
05. marts 2007 - 18:20 #14
Nu tror jeg sgu, det virker :))
Jeg fjernede / i $images = glob("/"

Jeg tester lige lidt mere
Avatar billede hewa Nybegynder
05. marts 2007 - 18:41 #15
Kan det passe, den tager højde for jpg og JPG?
Filerne hedder det lidt blandet, da mit camera laver det med stort JPG og jeg selv laver det med lille jpg.

Hvis jeg gør sådan:
    $images = glob("" . $des . "{*.jpg,*.gif,*.png,*.jpeg,*.JPG,*.GIF,*.PNG,*.JPEG}", GLOB_BRACE);

Er jeg så ikke ude over det?
Kan man evt. gøre noget, der også tager højde for JpG?
- min kæreste kommer også til at skulle lave nogen... ja så ved du jo, hvordan det kan gå, haha :)
Avatar billede hewa Nybegynder
05. marts 2007 - 18:49 #16
Jeg kan nu se, når filen hedder noget med stort, JPG, så vil den heller ikke blive vist på siden. Kan man evt. omdøbe den til lille, jpg, undervejs, uanset hvordan det er skrevet fra starten?
Avatar billede hewa Nybegynder
05. marts 2007 - 19:13 #17
Jeg brugte strtolower() og det virker :))

Tusinde tak for den flotte og anvendelig kode, jakobdo!

Smid svar, der er velfortjente point til dig!
Avatar billede hewa Nybegynder
05. marts 2007 - 20:27 #18
jacobdo, der er 60 point mere på højkant, hvis du kan hjælpe med den sidste ting, der lige slår mig. Det kunne jeg være rart, hvis vi kunne se billedet - og godkende det inde, det bliver smidt op på serveren. Så har du en ide til, hvordan vi kan kan se billedet og under er der to knapper, godkend eller godkend ikke. Bliver det godkendt, smides det op på serveren og gør det ikke, starter man bare forfra.

Har du et bud på det?
Avatar billede jakobdo Ekspert
05. marts 2007 - 21:50 #19
Det har jeg bestemt.
Jeg prøve lige at udtænke en ide...
Avatar billede jakobdo Ekspert
05. marts 2007 - 22:18 #20
Her skulle den være:

<?php
session_start();
//http://www.eksperten.dk/spm/766108

$uploadDir = '766108/';
$ok_typer = array('jpg','gif','png','jpeg');

if($_POST['upload'])
{
    if($_FILES['picture']['size'] > 0)
    {
        $ext = strtolower(end(explode('.',$_FILES['picture']['name'])));
       
        if(in_array($ext,$ok_typer))
        {
            //Indeholder alle billeder...
            $images = glob($uploadDir . '{*.' . implode(',*.',$ok_typer) . '}', GLOB_BRACE);
           
            //Hjælpe array
            $temp = array();
            foreach($images AS $image)
            {
                $info = pathinfo($image);
                $temp[] = basename($image,'.'.$info['extension']);
            }
           
            natcasesort($temp);
           
            $lastFileName = end($temp);
           
            $nextFileName = intval($lastFileName) + 1;
           
            $newFileName = $uploadDir . $nextFileName . '.' . $ext;
           
            move_uploaded_file($_FILES['picture']['tmp_name'],$newFileName);
            $_SESSION['filename'] = $newFileName;
           
            echo 'Gem billede: <img src="'.$newFileName.'" alt="'.$newFileName.'"><br >';           
            echo '<form action="'.$_SERVER['PHP_SELF'].'" method="post">';
            echo '<input type="submit" value="Delete Picture" name="delete">';
            echo '<input type="submit" value="Accept Picture" name="accept">';
            echo '</form>';
        }
        else
        {
            echo '<div style="color:red; font-size:20px; font-weight:bold;">Forkert type billede, tilladte typer: ('.implode(', ',$ok_typer).')</div>';
        }
    }
    else
    {
        echo '<div style="color:red; font-size:20px; font-weight:bold;">Du skal oploade et billede</div>';
    }
}
if($_POST['delete'])
{
    unlink($_SESSION['filename']);
    $_SESSION['filename'] = null;
    header('Location: ' .$_SERVER['PHP_SELF'] );
    exit();
}
if($_POST['accept'])
{
    $_SESSION['filename'] = null;
    header('Location: ' .$_SERVER['PHP_SELF'] );
    exit();
}

echo '<form action="'.$_SERVER['PHP_SELF'].'" method="post" enctype="multipart/form-data">';
echo 'Billede ('.implode(', ',$ok_typer).'): <input type="file" name="picture"><br />';
echo '<input type="submit" value="Upload Picture" name="upload">';
echo '</form>';

?>
Avatar billede jakobdo Ekspert
05. marts 2007 - 22:18 #21
Og du får lige et svar så!
Avatar billede hewa Nybegynder
06. marts 2007 - 18:46 #22
Jeg har lavet nogle ændringer, da jeg ikke helt kan bruge din kode og det virker fint, indtil der skal uploades, så falder kæden af, det vil den desværre ikke...

Jeg kan bla. ikke bruge header, da jeg har html over min php kode, men det plejer jeg at erstatte med echo "<meta http-equiv='Refresh' content='0;url=?en-eller-anden-url'>"; og det virker altid. Dog har jeg nu erstattet det med en tekst, så der kommer en tekst, så jeg kan se, om billedet er uploadet eller ej.

Derudover har jeg erstattet dine action fra "'.$_SERVER['PHP_SELF'].'" til blot "", det plejer også at virke.

Min kode ser sådan nu sådan ud - og det hele virker som sagt, bortset fra at billedet ikke bliver uploadet:

$uploadDir = 'pix/lovestory_pix';
$ok_typer = array('jpg','gif','png','jpeg');

if($_POST['upload'])
{
    if($_FILES['picture']['size'] > 0)
    {
        $ext = strtolower(end(explode('.',$_FILES['picture']['name'])));
       
        if(in_array($ext,$ok_typer))
        {
            //Indeholder alle billeder...
            $images = glob($uploadDir . '{*.' . implode(',*.',$ok_typer) . '}', GLOB_BRACE);
           
            //Hjælpe array
            $temp = array();
            foreach($images AS $image)
            {
                $info = pathinfo($image);
                $temp[] = basename($image,'.'.$info['extension']);
            }
           
            natcasesort($temp);
           
            $lastFileName = end($temp);
           
            $nextFileName = intval($lastFileName) + 1;
           
            $newFileName = $uploadDir . $nextFileName . '.' . $ext;
           
            move_uploaded_file($_FILES['picture']['tmp_name'],$newFileName);
            $_SESSION['filename'] = $newFileName;
           
            echo 'Gem billede: <img src="'.$newFileName.'" alt="'.$newFileName.'"><br >';           
            echo '<form action="" method="post">';
            echo '<input type="submit" value="Delete Picture" name="delete">';
            echo '<input type="submit" value="Accept Picture" name="accept">';
            echo '</form>';
        }
        else
        {
            echo '<div style="color:red; font-size:12px; font-weight:bold;">Forkert type billede, tilladte typer: ('.implode(', ',$ok_typer).')</div>';
        }
    }
    else
    {
        echo '<div style="color:red; font-size:12px; font-weight:bold;">Du skal oploade et billede</div>';
    }
}
if($_POST['delete'])
{
    unlink($_SESSION['filename']);
    $_SESSION['filename'] = null;
        echo "Billedet blev slettet igen";
}
if($_POST['accept'])
{
    $_SESSION['filename'] = null;
        echo "Billedet er uploadet";
}

echo '<form action="" method="post" enctype="multipart/form-data">';
echo 'Billede ('.implode(', ',$ok_typer).'): <input type="file" name="picture"><br />';
echo '<input type="submit" value="Upload Picture" name="upload">';
echo '</form>';


Kan du se, hvad der er galt?
Avatar billede hewa Nybegynder
06. marts 2007 - 18:52 #23
STOOOOP - fejlen er fundet, tror jeg :))

Jeg havde ikke fået lavet den sidste / i:
$uploadDir = 'pix/lovestory_pix/';

Jeg tester lige lidt mere
Avatar billede hewa Nybegynder
06. marts 2007 - 18:57 #24
Jeg tror altså det virker nu, så jeg er en glad mand :)
- skulle der opstå noget, hører du lige fra mig igen, okay?

Der ligger også point til dig her:
http://www.eksperten.dk/spm/766489

Tak for et flot stykke brugbart kode!
Avatar billede jakobdo Ekspert
06. marts 2007 - 19:10 #25
Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester