Avatar billede Milla-Tigerdyr Praktikant
03. november 2011 - 17:18 Der er 31 kommentarer og
1 løsning

Logo upload.

Hej eksperter.
Jeg har tænkt på noget i forhold til at hver medlem skal kunne have sit eget lille logo.
Jeg har pt. et upload script der bliver brugt til noget andet lige nu, men med nogle justeringer vil det nok kunne virke.

Mit problem er bare, at det script jeg har nu, uploader til en mappe på min ftp. server. - Det skal den sådan set stadig, MEN den skal vil også sætte et link ind i databasen, for at jeg kan finde ud af hvilket logo der tilhører hvem, ikke?

Jeg ved ikke hvordan jeg skal bærer mig ad med dét. Udover det, sætter mit script altså også alle mulige tal foran det "egentlige" navn?? :)

Her kan i se mit script:
upload.php ; http://pastebin.com/zLEju2K1
upload_file.php ; http://pastebin.com/EU8mfBk5

- Kan man sætte nogle "mål" på hvor stort ens logo må være?
Avatar billede wanze Nybegynder
03. november 2011 - 21:22 #1
Den bedste løsning ville være at gemme logoet som brugerens ID i din database - jeg går ud fra, at dine brugere ligger i databasen, hvor de hver har fået tildelt et ID som deres primære nøgle. På den måde sikrer du dig, at hvis et logo er blevet uploadet, og en anden bruger uploader et andet logo med samme navn, så bliver billedet overskrevet. Derudover gør det det også bare nemt for dig, når du skal vise brugerens logo, idet du på forhånd kender navnet på billedet.

Hvad angår de tal du snakker om, så kan du på linje 17 se, hvordan filen bliver navngivet:

$path="VHT_uploades/" . time() . "_" . $name;

De tal du taler om skyldes time(), der returnerer det nuværende UNIX-timestamp, dvs. antal sekunder der er gået siden 1. januar 1970.
Avatar billede danco Nybegynder
03. november 2011 - 23:42 #2
Jeg er ikke tilhænger af wanze's løsning. Jeg ville vælge at genere en tilfældigt "nøgle" og navngive billedet med og så gemme det navn i databasen.
Som jeg ser det giver det mindre praktisk arbejde og kan potentielt afværge nogle sikkerheds issues, og den lille smule plads det måtte tage i databasen kan jeg ikke forestille mig skulle være noget problem.

Jeg smider lige en lille smule kode der muligvis kunne bruges til at lave det filnavn med.

$ext = explode(".", $file['name']);
$random = sha1($file['name'].time())."_".$_SESSION['userId'].".".$ext[count($ext)-1];

Denne smule kode inkluderer også brugerID i filstien men smækker bare en tilfældig streng sammen som den sætter foran.
Avatar billede danco Nybegynder
03. november 2011 - 23:45 #3
Omkring mål...
Du kan få billedets størrelse i pixel ved at bruge:

getimagesize($img_path);
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 10:30 #4
Wanze; Åh, det forklarer tallene tak! :)

Her komme et spørgsmål til begge løsninger;

Hvordan forbinder jeg så min ftp. server, med min mysql database? Tænker i forhold til, at f.eks vil logo'et nok blive lavet om nogle gange, OG så når man f.eks går ind på brugerlisten, der er brugerens logo jo.
Hvordan kan den finde ud af, hvilket logo der tilhøre hvem?
Fordi der skal vel sættes et link ind til logoet i databasen på en eller anden måde, ikke?
Avatar billede danco Nybegynder
04. november 2011 - 13:48 #5
Det du gør er følgende:
I din bruger tabel i database tilføjer du følgende attribut:
logoPath varchar(40)
Nu har du en kolonne i databasen som kan indeholde billedets navn.

Når man så uploader et billede skal du jo generere det tilfældige navn, det kan du gøre på mange måder, men jeg smed et bud ovenfor. Sørg så for at gemme navnet i en variabel som du bruger til at navngive og gemme i databasen, så det ikke kan ændre sig gennem scriptet.
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 13:52 #6
Danco; Det forstår jeg ikke..du sætter jo ikke noget ind i databasen nogen steder? Forstår bare ikke, hvordan de to ting hænger sammen..

Hvor skal jeg gemme navnet, og i hvad? :S
Avatar billede danco Nybegynder
04. november 2011 - 14:17 #7
Okay, jeg smider lige noget kode i stedet , det kan måske være at det gør det liv lettere :)

<?php
//Filens midlertidige placering
$file=$_FILES['fil']['tmp_name'];

//Laver alle mellemrum om til underscore i fil navnet
$name=$_FILES['fil']['name'];
$name=str_replace(" ", '_', $name);

//Filens endelse
$ext=strrchr($_FILES['fil']['name'],'.');
$ext=strtolower($ext);

//Filtyper
$types=array(".gif", ".jpg", ".png", ".PNG", ".JPG", ".GIF");

//Destination
$folder ="VHT_uploades/";
$filename = sha1(time()."EnHemmeLigNøgle").'.'.$ext;

//tjekker om filypen er tilladt
if(in_array($ext, $types) && $_FILES['fil']['size'])
{
    move_uploaded_file($file, $folder.$filename);
    chmod($folder.$filename, 0644);
    $sql = "UPDATE users SET logopath='".$filename."' WHERE  userid=xxxx";
    mysql_query($sql) or die(mysql_error());
    header("location: bruger.php");
}
else
{
    echo "Din fil skal være i enten GIF, JPG eller PNG format!";
}
?>


Jeg har forsøgt mig med at lave en lille tilføjelse til scriptet, du skal bare selv sørge for at forbinde til databasen i toppen af dokumentet og udskrift brugerID'et i sql strengen. og generelt tilpasse lidt til dine behov.
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 14:22 #8
Skal der blive ved med at stå userid=xxxx, eller skal jeg hente brugerID'en?

- Udover det skal alt ved $filename så også bare stå som det gør?
Avatar billede danco Nybegynder
04. november 2011 - 14:27 #9
Uden at have testet det vil jeg mene at det står korrekt til at fungerer.

userid=xxx skal du naturligvis erstatte med en hvad end din primærnøgle på brugeren hedder og så naturligvis vedkomnes ID. Umiddelbart vil jeg gætte på at du har ID'et gemt i en session eller lign som du kan bruge.
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 15:01 #10
Det virker sådan..næsten..
Den sætter dette ind i databasen; 0a2be953ec82a7511d351036596864fea84fa845

Og jeg udskriver f.eks dette:
<form action="upload_logo.php" method="post" enctype="multipart/form-data">
Upload nyt logo:<br>
<?php
echo '
<br>
<br>
<img src=';
$img = $rows['logoPath'];
echo $img;
echo ">";
?>
<br>
<input type="file" name="fil"><br>
<input type="submit" value="Upload!">
</form>


- Så er det jo klart at den ikke kan finde ud af at lave det til et billede..hvad skal jeg så gøre? :S
Avatar billede danco Nybegynder
04. november 2011 - 15:13 #11
Okay så har vi en lille opgave foran os. Den udelader filtypen i databasen.
prøv og tilføje:

die($filename);

lige efter denne linje:

$filename = sha1(time()."EnHemmeLigNøgle").'.'.$ext;
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 15:16 #12
Der kommer stadig ingen filtype på. :S
Avatar billede danco Nybegynder
04. november 2011 - 15:27 #13
Nu har jeg lige testet det hos mig selv. Og med nedenstående kode virker navngivningen fint.

//Filens midlertidige placering
$file=$_FILES['fil']['tmp_name'];

//Laver alle mellemrum om til underscore i fil navnet
$name=$_FILES['fil']['name'];
$name=str_replace(" ", '_', $name);

//Filens endelse
$ext=strrchr($_FILES['fil']['name'],'.');
$ext=strtolower($ext);

//Filtyper
$types=array(".gif", ".jpg", ".png", ".PNG", ".JPG", ".GIF");

//Destination
$folder ="VHT_uploades/";
$filename = sha1(time()."EnHemmeLigNøgle").$ext;
die($filename);
//tjekker om filypen er tilladt
if(in_array($ext, $types) && $_FILES['fil']['size'])
{
    move_uploaded_file($file, $folder.$filename);
    chmod($folder.$filename, 0644);
    $sql = "UPDATE users SET logopath='".$filename."' WHERE  userid=xxxx";
    mysql_query($sql) or die(mysql_error());
    header("location: bruger.php");
}
else
{
    echo "Din fil skal være i enten GIF, JPG eller PNG format!";
}
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 15:35 #14
Nu laver den slet ikke logo'et om. :S
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 15:40 #15
Hvis jeg fjerner
die($filename);


Så virker det, bortset fra at filtypen ikke kommer med..:S
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 15:42 #16
Nej, det virker ikke engang ordentligt, fordi efter du skrev den nye kode, sætter den det altså ikke ind på ftp. serveren mere. :S
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 15:46 #17
<?php
session_start();
include("functions.php");
error_reporting(E_ALL);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<link href="style.css" rel="stylesheet" type="text/css">
<?
$userid = $_SESSION['userid'];
if(!is_numeric($userid)) { die('Af sikkerhedsmæssige årsager er siden stoppet i at loade. Kontakt webmaster hvis fejlen fortsætte'); exit(); }

//Filens midlertidige placering
$file=$_FILES['fil']['tmp_name'];

//Laver alle mellemrum om til underscore i fil navnet
$name=$_FILES['fil']['name'];
$name=str_replace(" ", '_', $name);

//Filens endelse
$ext=strrchr($_FILES['fil']['name'],'.');
$ext=strtolower($ext);

//Filtyper
$types=array(".gif", ".jpg", ".png", ".PNG", ".JPG", ".GIF");

//Destination
$folder ="images/";
$filename = sha1(time()."EnHemmeLigNøgle").'.'$ext;
die($filename);

//tjekker om filypen er tilladt
if(in_array($ext, $types) && $_FILES['fil']['size'])
{
    move_uploaded_file($file, $folder.$filename);
    chmod($folder.$filename, 0644);
    $sql = "UPDATE members SET logoPath='".$filename."' WHERE id=$userid";
    mysql_query($sql) or die(mysql_error());
    header("location: bruger.php");
}
else
{
    echo "Din fil skal være i enten GIF, JPG eller PNG format!";
}
?>

Her virker upload'en, men navngivningen virker IKKE. (der mangler stadig endelsen)
Avatar billede danco Nybegynder
04. november 2011 - 18:10 #18
Den kommer ikke videre fra die($filename), den stopper scriptet .

Du skal ændre:
$filename = sha1(time()."EnHemmeLigNøgle").'.'$ext;

til
$filename = sha1(time()."EnHemmeLigNøgle").$ext;

Så burde der kommer endelse på filnavnet, så er det bare spørgsmålet om den ligger billedet i den rigtige mappe på serveren
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 18:50 #19
Danco, jamen hvis jeg ændre det, så er det nemlig at den ikke uploader til min ftp. server, og jeg har tjekket alle mapper den kunne ellers havne i, den bliver ikke uploadet til images, eller nogen anden mappe.

Hvis jeg ændre den linje, virker ikke noget af det, mener jeg..
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 18:53 #20
Hvis jeg ændre linjen som du sagde, og fjerner die, så uploader den både til ftp & mysql, men der er stadig ingen filtype i mysql..:S
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 18:56 #21
Jeg har fundet fejlen, det var fordi der ikke var plads til at skrive endelsen med de 40 i varchar.

Det virker næsten nu.. Den viser bare blank side når man har uploadet, men den fuldføre uploadingen??

- Udover det, kan jeg så gøre sådan at logo'et f.eks skal være 120x250 px.?
Avatar billede danco Nybegynder
04. november 2011 - 19:44 #22
Du kan få billede oplysningerne på denne måde:

$size = getimagesize($file);
$width = $size[0];
$height = $size[1];

$file er den variabel du allerede har i dit script som repræsenterer $_FILES['fil']['tmp_name'];

Det kan du så gøre brug af som du vil :)
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 19:47 #23
Skal jeg så f.eks skrive;

$size = getimagesize($file);
$width = $size[210];
$height = $size[111];

?
Avatar billede danco Nybegynder
04. november 2011 - 19:57 #24
Nej :)
Du skal bruge de 2 variable til at opsætte betingelser som for eksempel:

$size = getimagesize($file);
$width = $size[0];
$height = $size[1];
$maxHeight = 300;
$maxWidth = 200;

if($width > $maxWidth && $height > $maxHeight ) {
  echo  'Billeder er for stort. Dit billede har følgende dimensioner: '.$width.'/'.$height.' pixels';
} else {
  //billeder er inden for normen
}
Avatar billede danco Nybegynder
04. november 2011 - 20:02 #25
Og du bør naturligvis ændre && til || i mit kodeeksempel :)

Det gik vidst lige lidt stærkt.
Avatar billede Milla-Tigerdyr Praktikant
04. november 2011 - 20:12 #26
Den bliver ved med at uploade korrekt;

<?php
session_start();
include("functions.php");
error_reporting(E_ALL);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<link href="style.css" rel="stylesheet" type="text/css">
<?
$userid = $_SESSION['userid'];
if(!is_numeric($userid)) { die('Af sikkerhedsmæssige årsager er siden stoppet i at loade. Kontakt webmaster hvis fejlen fortsætte'); exit(); }

//Filens midlertidige placering
$file=$_FILES['fil']['tmp_name'];

//Laver alle mellemrum om til underscore i fil navnet
$name=$_FILES['fil']['name'];
$name=str_replace(" ", '_', $name);

//Filens endelse
$ext=strrchr($_FILES['fil']['name'],'.');
$ext=strtolower($ext);

//Filtyper
$types=array(".gif", ".jpg", ".png", ".PNG", ".JPG", ".GIF");

//Destination
$folder ="images/";
$filename = sha1(time()."EnHemmeLigNøgle").$ext;

//tjekker om filypen er tilladt
if(in_array($ext, $types) && $_FILES['fil']['size'])
{
    move_uploaded_file($file, $folder.$filename);
    chmod($folder.$filename, 0644);
    $sql = "UPDATE members SET logoPath='".$filename."' WHERE id=$userid";
    mysql_query($sql) or die(mysql_error());
    header("location: bruger.php");
}
else
{
    echo "Din fil skal være i enten GIF, JPG eller PNG format!";
}
$size = getimagesize($file);
$width = $size[0];
$height = $size[1];
$maxHeight = 210;
$maxWidth = 118;

if($width > $maxWidth || $height > $maxHeight ) {
  echo  'Billeder er for stort. Dit billede har følgende dimensioner: '.$width.'/'.$height.' pixels';
} else {
echo "logo'et blev uploadet korrekt!";
}
?>
Avatar billede danco Nybegynder
04. november 2011 - 21:42 #27
<?php
session_start();
include("functions.php");
error_reporting(E_ALL);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ (...)
<link href="style.css" rel="stylesheet" type="text/css">
<?
$userid = $_SESSION['userid'];
if(!is_numeric($userid)) { die('Af sikkerhedsmæssige årsager er siden stoppet i at loade. Kontakt webmaster hvis fejlen fortsætte'); exit(); }

//Filens midlertidige placering
$file=$_FILES['fil']['tmp_name'];

//Laver alle mellemrum om til underscore i fil navnet
$name=$_FILES['fil']['name'];
$name=str_replace(" ", '_', $name);

//Filens endelse
$ext=strrchr($_FILES['fil']['name'],'.');
$ext=strtolower($ext);

//Filtyper
$types=array(".gif", ".jpg", ".png", ".PNG", ".JPG", ".GIF");

//Destination
$folder ="images/";
$filename = sha1(time()."EnHemmeLigNøgle").$ext;

//Billedets størrelse
$size = getimagesize($file);
$width = $size[0];
$height = $size[1];
$maxHeight = 210;
$maxWidth = 118;

//tjekker om filypen er tilladt og størrelsen er indenfor det tilladte
if(in_array($ext, $types) && $_FILES['fil']['size'] && $width <= $maxWidth && $height <= $maxHeight) {
    move_uploaded_file($file, $folder.$filename);
    chmod($folder.$filename, 0644);
    $sql = "UPDATE members SET logoPath='".$filename."' WHERE id=$userid";
    mysql_query($sql) or die(mysql_error());
    header("location: bruger.php");
} else {
    echo "Din fil skal være i enten GIF, JPG eller PNG format!";
}
?>

Så har jeg indsat det således at det burde virke efter hensigten
Avatar billede Milla-Tigerdyr Praktikant
05. november 2011 - 08:10 #28
Jeg fjernede lige type tingen, men den bliver altså ved med at sige mine mål er forkerte? Altså at den skal være 210x120, og det ER den?:S
Har også prøvet hvor den er under & over, det er det samme..?

<?php
session_start();
include("functions.php");
error_reporting(E_ALL);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ (...)
<link href="style.css" rel="stylesheet" type="text/css">
<?
$userid = $_SESSION['userid'];
if(!is_numeric($userid)) { die('Af sikkerhedsmæssige årsager er siden stoppet i at loade. Kontakt webmaster hvis fejlen fortsætte'); exit(); }

//Filens midlertidige placering
$file=$_FILES['fil']['tmp_name'];

//Laver alle mellemrum om til underscore i fil navnet
$name=$_FILES['fil']['name'];
$name=str_replace(" ", '_', $name);

//Filens endelse
$ext=strrchr($_FILES['fil']['name'],'.');
$ext=strtolower($ext);

//Destination
$folder ="images/";
$filename = sha1(time()."EnHemmeLigNøgle").$ext;

//Billedets størrelse
$size = getimagesize($file);
$width = $size[0];
$height = $size[1];
$maxHeight = 210;
$maxWidth = 120;

//tjekker om filypen er tilladt og størrelsen er indenfor det tilladte
if(in_array($ext) && $_FILES['fil']['size'] && $width <= $maxWidth && $height <= $maxHeight) {
    move_uploaded_file($file, $folder.$filename);
    chmod($folder.$filename, 0644);
    $sql = "UPDATE members SET logoPath='".$filename."' WHERE id=$userid";
    mysql_query($sql) or die(mysql_error());
    header("location: bruger.php");
} else {
    echo "Den må max. være 210x120 px!";
}
?>
Avatar billede danco Nybegynder
05. november 2011 - 18:53 #29
Så har jeg lavet det så det virker :) Samtidig har jeg tilladt mig at rydde lidt op i koden så den bliver pænere og lettere læselig og samtidig giver dig mulighed for at returnerer en mere specifik fejlbeskrivelse til brugeren.

    $userid = $_SESSION['userid'];
if(!is_numeric($userid)) { die('Af sikkerhedsmæssige årsager er siden stoppet i at loade. Kontakt webmaster hvis fejlen fortsætte'); exit(); }


    //Filens midlertidige placering
    $file=$_FILES['fil']['tmp_name'];

    //Laver alle mellemrum om til underscore i fil navnet
    $name=$_FILES['fil']['name'];
    $name=str_replace(" ", '_', $name);

    //Filens endelse
    $ext=strrchr($_FILES['fil']['name'],'.');
    $ext=strtolower($ext);

    //Filtyper
    $types=array(".gif", ".jpg", ".png", ".PNG", ".JPG", ".GIF");

    //Destination
    $folder ="images/";
    $filename = sha1(time()."EnHemmeLigNøgle").$ext;

    //Billedets størrelse
    $size = getimagesize($file);
    $width = $size[0];
    $height = $size[1];
    $maxHeight = 210;
    $maxWidth = 118;

    //tjekker om filypen er tilladt og størrelsen er indenfor det tilladte
    if(in_array($ext, $types)) {
        if($width<=$maxWidth){
            if($height<=$maxHeight){
                if(move_uploaded_file($file, $folder.$filename)){
                    chmod($folder.$filename, 0644);
                    $sql = "UPDATE members SET logoPath='".$filename."' WHERE id=$userid";
                    mysql_query($sql) or die(mysql_error());
                    header("location: bruger.php");
                } else {
                    die("Kunne ikke flytte filen");
                }
            } else {
                die("Billedet er for højt");
            }
        } else {
            die("Billedet er for bredt");
        }
    } else {
      die("Din fil skal være i enten GIF, JPG eller PNG format!");
    }
Avatar billede danco Nybegynder
07. november 2011 - 15:13 #30
Har du fået det til at virke Milla ?
Avatar billede Milla-Tigerdyr Praktikant
10. november 2011 - 16:30 #31
Yes, undskyld mit sene svar, har helt haft glemt det pga. skolen.

Smid du et svar. :D
Avatar billede danco Nybegynder
10. november 2011 - 17:32 #32
Så får du da bare et svar fra mig :)
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