Avatar billede macho Praktikant
09. december 2008 - 16:11 Der er 18 kommentarer og
1 løsning

Hvordan omdøbe billedfil efter $id ved upload til server?

Mit spørgsål lyder:
Hvordan omdøber jeg en billedfil, som jeg har uploadet via en form, filen bliver uploadet til folderen "images" og tilhørende data skrives i MySql-db.
Hvis nu $id bliver f.eks. 55 og der bliver uploadet en .jpg-fil, skal dette billede altså omdøbes til 55.jpg og dette nye navn skal så fremgå i rækken i mysql-db'en.

Min kode ser pt. sådan her ud:

<?

if(isset($_POST['upload']))
{
        $target = "images/";
        $target = $target . basename( $_FILES['userfile']['name']);
        $fileName = $_FILES['userfile']['name'];
        $tmpName  = $_FILES['userfile']['tmp_name'];
        $fileType = $_FILES['userfile']['type'];
        $fileSize = $_FILES['userfile']['size'];
        $companyname = $_POST['companyname'];
        $department = $_POST['department'];
        $address1 = $_POST['address1'];
        $address2 = $_POST['address2'];
        $country = $_POST['country'];
        $contactname = $_POST['contactname'];
        $phone = $_POST['phone'];
        $fax = $_POST['fax'];
        $email = $_POST['email'];
        $website = $_POST['website'];
        $fileNameny = str_replace(" ","_",$fileName);
        $fp = fopen($tmpName, 'r');
        $content = fread($fp, $fileSize);
        $content = addslashes($content);
        fclose($fp);
       
        if(!get_magic_quotes_gpc())
        {
            $fileName = addslashes($fileName);
        }
       
        $tmpName = $_FILES['userfile']['tmp_name'];
       
        list($width, $height, $type, $attr) = getimagesize($tmpName);
       
        if($width>235 || $height>130)
       
        {
            die("Exceeded image dimension limits: width= 235px height= 130px.");
        }
       

              // Connects to your Database
              mysql_connect("ip-address", "user", "password") or die(mysql_error()) ;
              mysql_select_db("database") or die(mysql_error()) ;
       
        $query = "INSERT INTO tabel (name, type, size, companyname, department, address1, address2, country, contactname, phone, fax, email, website ) ".
                "VALUES ('$fileNameny', '$fileType', '$fileSize', '$companyname', '$department', '$address1', '$address2', '$country', '$contactname', '$phone', '$fax', '$email', '$website')";

        mysql_query($query) or die('Error, query failed');
        //Writes the photo to the server
        move_uploaded_file($_FILES['userfile']['tmp_name'], $target);       
       
//        mysql_close($conn);
       
        echo "<br>Logo: <b>$fileNameny</b> uploaded
        <br> (type: $fileType - size: $fileSize)
        <br>Company name: <b>$companyname</b>
        <br>Department: <b>$department</b>
        <br>Address line 1: <b>$address1</b>
        <br>Address line 2: <b>$address2</b>
        <br>Country: <b>$country</b>
        <br>Contact name: <b>$contactname</b>
        <br>Phone: <b>$phone</b>
        <br>Fax: <b>$fax</b>
        <br>Email: <b>$email</b>
        <br>Website: <b>$website</b>";
}       
?>
Avatar billede jakobdo Ekspert
09. december 2008 - 17:18 #1
$target er det navn din fil/billede gemmes som, så den kan du jo bare ændre, inden du kalder move_uploaded_file()
Avatar billede macho Praktikant
09. december 2008 - 17:22 #2
$target er vel bestemmelsesfolderen på serveren? I dette tilfælde "images/"

?
Avatar billede macho Praktikant
09. december 2008 - 17:23 #3
I øvrigt er jeg ikke særlig skrap i php, så hvordan jeg ændrer og retter til, har jeg desværre ikke forstand til :-(
Avatar billede jakobdo Ekspert
09. december 2008 - 18:13 #4
Se her:

$target = "images/";
        $target = $target . basename( $_FILES['userfile']['name']);

Target er både images og filens navn.

Så fortæl mig gerne med eksempler, hvad din fil skal hedde og jeg skal vise dig det.
Avatar billede macho Praktikant
09. december 2008 - 20:05 #5
Filnavn når det uploades: billed-eksempel.jpg
Derefter bliver flere felter tilføjet og lagt ind i en række i db'en.

$id (autoincrement og unik)
$name (billedfilens navn)
$type (filens type)
$size (filens størrelse)
og herefter flere felter...

Det er så $name, som skal hedde det samme som $id + filtype (f.eks 55.jpg)

$id (f.eks. 55)
$type (image/jpeg)
$name (55.jpg)
$size (19876)
og herefter flere felter...
Avatar billede jakobdo Ekspert
09. december 2008 - 20:43 #6
Ret:
$target = "images/";
        $target = $target . basename( $_FILES['userfile']['name']);
til:
$target = "images/";

Og ret:
move_uploaded_file($_FILES['userfile']['tmp_name'], $target); 
til:
move_uploaded_file($_FILES['userfile']['tmp_name'], $target . mysql_insert_id() . '.' . strtolower( pathinfo( $_FILES['userfile']['name'], PATHINFO_EXTENSION ) ));
Avatar billede macho Praktikant
09. december 2008 - 21:04 #7
Mange tak, nu er halvdelen på plads, således, at filnavnet på serveren bliver navngivet efter $id - fint. Men i DB'en er $name stadig f.eks. billed-eksempel.jpg, og det skal være det samme som navnet på filen på serveren, altså ikke billed-eksempel.jpg, men f.eks. 55.jpg.
?
Avatar billede jakobdo Ekspert
09. december 2008 - 21:12 #8
Det kan du ikke rigtigt få, for ID får du først efter du har indsat i db.
Så skal du på en måde finde næste ID inden du indsætter og det kender jeg desværre ikke lige til.
Avatar billede macho Praktikant
09. december 2008 - 21:41 #9
Øv... måske en anden kan hjælpe mig lidt videre.

Kan man ikke bruge LAST_INSERT_ID og så lægge 1 til værdien plus filtypen, så det ender med det samme som jeg ønsker? Jeg er ude i gætværk, og ved ikke hvordan jeg skal komme videre?
Avatar billede jakobdo Ekspert
09. december 2008 - 21:47 #10
Du kan prøve at lave kaldet inden du indsætter:

$last_id = mysql_result(mysql_query("SELECT LAST_INSERT_ID() FROM tabel"),0);

og så bruge det i $filename og $target.
Avatar billede macho Praktikant
09. december 2008 - 22:40 #11
Hhmmm... det kan jeg ikke lige gennemskue nu.
Avatar billede jakobdo Ekspert
10. december 2008 - 06:30 #12
Hvem har lavet din kode ?
Avatar billede macho Praktikant
10. december 2008 - 08:28 #13
Koden er lavet ud fra et script et sted på nettet - kan ikke huske hvor...
Avatar billede jakobdo Ekspert
10. december 2008 - 08:33 #14
Så må jeg jo nok lave alt arbejdet for dig...

Ret:
$last_id = mysql_result(mysql_query("SELECT LAST_INSERT_ID() FROM tabel"),0);
$target = "images/";
        $target = $target . basename( $_FILES['userfile']['name']);

        $fileName = $_FILES['userfile']['name'];
til:
$ext = strtolower( pathinfo( $_FILES['userfile']['name'], PATHINFO_EXTENSION ) );
$target = "images/";
        $fileName = $last_id . '.' . $ext;
        $target = $target . $fileName;

Så tror jeg du kan bruge dit oprinde script.
Avatar billede jakobdo Ekspert
10. december 2008 - 08:34 #15
Fejl, det skal være sådan:

Ret:
$target = "images/";
$target = $target . basename( $_FILES['userfile']['name']);
$fileName = $_FILES['userfile']['name'];

til:
$last_id = mysql_result(mysql_query("SELECT LAST_INSERT_ID() FROM tabel"),0);
$ext = strtolower( pathinfo( $_FILES['userfile']['name'], PATHINFO_EXTENSION ) );
$target = "images/";
$fileName = ($last_id + 1) . '.' . $ext;
$target = $target . $fileName;
Avatar billede macho Praktikant
10. december 2008 - 09:08 #16
Efter at have ændret til ovenstående er $name i både DB og filnavn på serveren hver gang 1.jpg - extension skrives korrekt hver gang - altså hele tiden et et-tal: 1.filtype?
Avatar billede jakobdo Ekspert
10. december 2008 - 10:43 #17
Prøv lige at kald SELECT LAST_INSERT_ID() FROM tabel i phpmyadmin.
Avatar billede macho Praktikant
10. december 2008 - 10:49 #18
Det har jeg gjort og jeg får resultatet "0" (nul) - det er selvfølgelig forklaring på, at 0+1 giver 1, men hvorfor mon det er sådan?
Avatar billede macho Praktikant
07. december 2009 - 18:45 #19
Fik aldrig det her til at virke, og er ikke aktuelt længere, så jeg lukker.
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