Avatar billede thomasdaco Nybegynder
24. februar 2012 - 12:20 Der er 28 kommentarer

Udvidelser til image upload + thumbnails

Hermed mit nuværende script.
Det kan uploade et billede og derefter oprette en thumbnail.
Det virker også fint.

jeg ønsker lidt mere :

*En MAX størrelse på billede filen.
*Hvis ikke der uploades et billede, skal der insættes et dummy billede
*Muligheden for at indsætte andre formater feks gif,png.



$allowedFiles = array('jpg');
$curDir      = getcwd();
$uploadDir    = '/upload/';

if(isset($_POST['newfounding']) && $_FILES['userfile']['size'] >0)
{

    $ext = strtolower(end(explode('.',$_FILES['userfile']['name'])));
    if(in_array($ext,$allowedFiles))
    {
        $file = md5(uniqid(rand(), true)) . '.jpg';

        if(move_uploaded_file($_FILES['userfile']['tmp_name'], $curDir . $uploadDir . $file))
        {
          mysql_query("INSERT INTO Foundings(picture_url, name, gps, share, users_id, dato, info, type, dane)
          VALUES ('$file', '$foundingname', '$gps', '$share', '$users_id', '$dato', '$info', '$fundtype', '$dane')") or die(mysql_error());
                       
       
            // THUMBNAIL BLIVER LAVET HER:
            $thumbnailDir = '/thumbnails/';
            make_thumbnail(
              $curDir . $uploadDir . $file,
              $curDir . $thumbnailDir,
              0.5
            );
     
      }
    }
}

function make_thumbnail($filename, $thumbs_dir, $percent = 0.5)
{
  // her der får du fat i højde og bredde af billedet og skalerer disse værdier:
  list($width, $height) = getimagesize($filename);
  $newwidth = $width * $percent;
  $newheight = $height * $percent;

  // imagecreatetruecolor() laver et nyt resource-object i
  // PHP, en speciel PHP datatype som bruges når man bruger
  // GD lib. $thumb er altså en resource som indeholder
  // en ren data-struktur til et nyt billede - det nye thumbnail
  // billede. Imagecreatefromjpeg() indlæser dit billede
  // som var det JPEG. Her forventes et JPEG billed. Der
  // findes funktioner til indlæsning af andre billede
  // formater. $source er et resource-object som
  // nu indeholder det uploadede billed:
  $thumb = imagecreatetruecolor($newwidth, $newheight);
  $source = imagecreatefromjpeg($filename);

  // Magien ligger i at bruge imagecreateresized().
  // Den modtager de to resource-objekter,
  // pixel koordinater i destination og kilde-billedet (her begge 0,0)
  // og de nye og gamle billede størelser.
  // Det den gør er simpelthen at lave en ny skaleret kopi
  // af det som ligger i $source og gemme det i $thumb.
  imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

  // Her gemmes thumbnail billedet:
imagejpeg($thumb, $thumbs_dir.'thumb_'.basename($filename));
}
Avatar billede danco Nybegynder
24. februar 2012 - 12:31 #1
Dummy billedet ville jeg vælge at håndtere i forbindelse med visning af billedet. Forstået på den måde at hvis der ikke allerede er uploadet et billede ville jeg vise et prædefineret billede i en if-struktur.
Omkring udvidelse til flere filtyper, er ville jeg ville være at bruge et array af strings indeholdende MIME typerne på de godkendte filtyper det gør dig i stand til at tjekke om mime typen er godkendt ved brug af in_array funktionen.
Du kunne vælge at definere dit array på følgende måde:

$types = array("image/jpeg","image/gif");

Omkring billedestørrelsen, her kan du meget simpelt tjekke højde og bredde via getimagesize funktionen, om du kan tjekke størrelsen på den midlertidige placering inden du gemmer ved jeg faktisk ikke, men jeg kan ikke se der skulle være noget problem i det, ellers er det bare at opsætte en procedure der sletter billedet igen hvis det ikke overhoveder kravene, dog er det altid at foretrække at tjekke før du gemmer.
Avatar billede olebole Juniormester
24. februar 2012 - 13:09 #2
<ole>

At tjekke på MIME alene er en særdeles risikabel idé. Den kan meget let fakes, og så er fanden løs, hvis filen hedder .php og har et 'ubehageligt' indhold  *o)

Prøve at kikke på denne løsning, hvor der tjekkes på både MIME og extension. Det er langt sikrere. Desuden bruger den en 'hash tabel' i stedet for in_array, som er en meget dårligt performende funktion.

/mvh
</bole>
Avatar billede thomasdaco Nybegynder
25. februar 2012 - 10:50 #3
Min image uploade er bygget således at den smider nogle andre information i min DB som du også kan se på min SQL streng.

Hvis jeg vælger ikke at uploade et billede, så skal den bare indsætte et dummy billede.
Avatar billede olebole Juniormester
25. februar 2012 - 11:40 #4
"*En MAX størrelse på billede filen.":

if(isset($_POST['newfounding']) && $_FILES['userfile']['size']>0 && $_FILES['userfile']['size']<100000)

"*Hvis ikke der uploades et billede, skal der insættes et dummy billede" >> Håndteres ved visningen. Vis dummybilledet, hvis der ikke er uploaded et billede.

"*Muligheden for at indsætte andre formater feks gif,png." >> Prøv at kikke på denne løsning

De to sidste ønsker har vi allerede svaret på én gang. Læs, hvad vi skriver - eller fortæl, hvad du ikke forstår - eller forklar, hvorfor du ikke er tilfreds med løsningerne.
Avatar billede intel4004 Novice
25. februar 2012 - 21:08 #5
Hej Thomas,

Er du kommet videre?

De ting du efterlyser er sådan set bare generelle logiske problemstillinger. Det er ikke så specifikt til GDLib eller oprettelse af thumbnail. Olebole opsummerer fint de svar der er givet. At han så mister tålmodigheden lidt til sidst skal du ikke tage dig af :)

Men prøv og sæt dig ned med et stykke A4 papir og tegn nogle bokse og nogle pile som forklarer det flow af valg der gøres i dit program. Dette kaldes (i min verden) et flowchart og kan tit gøre en tilsyneladende kompleks problemstilling meget nemmere.

Men du får nok ikke nogen til at programmere det for dig :)

Mvh Ole
Avatar billede olebole Juniormester
25. februar 2012 - 22:33 #6
Der har da vist ikke været nogen mistet tålmodighed i denne tråd, men jeg kan naturligvis ikke tale for alle. Jeg påpeger blot det hensigtsmæssige i at læse de svar, man får - og det bør spørger naturligvis i egen interesse tage sig af  *o)
Avatar billede thomasdaco Nybegynder
11. marts 2012 - 21:18 #7
Hej Olebole,

Beklager jeg ikke har svaret før nu.
jeg har forgæves forsøgt at anvende din løsning vedr. andre formater, men det fejler, måske fordi jeg ikke er 100 meter mester i php :( ... men din korrekte løsning med størrelse er ok og sat i værk. Ligeledes løsningen ved mit dummy billede, så har du skåret det ud i pap for mig :) men jeg efterlyser så en løsning på mit eksiterende script, hvor det vil fejle hvis jeg ikke indsætter et billede, hvordan vil mit upload virke hvis ikke brugeren indsætter et billede, der er nemlig også en del andre felter i sammt script.
Giver min forklaring mening ?

intel4004 -> god ide med at nedskrive sin proces, det giver en del stof til eftertanke.
Avatar billede olebole Juniormester
11. marts 2012 - 22:22 #8
Forklar, hvad det betyder, at 'det fejler'. Hvad sker der og hvad sker der ikke. Får du fejl - og hvis du gør, vil det være hensigtsmæssigt, om du fortæller, hvad de siger  =)
Avatar billede thomasdaco Nybegynder
14. marts 2012 - 17:54 #9
Hej Olebole,

Jeg har rettet så jeg ikke får nogen fejl men der sker heller ikke noget
Mit script ser uploadning script ser således ud ->

//Image upload------------

$allowedExts = array(
    'jpg' => 1,
    'jpeg' => 1,
    'png' => 1,
    'gif' => 1
);

$allowedMimes = array(
    'image/jpg' => 1,
    'image/x-jpg' => 1, // IE
    'image/jpeg' => 1,
    'image/x-jpeg' => 1, // IE
    'image/pjpg' => 1, // Progressiv JPG
    'image/png' => 1,
    'image/x-png' => 1, // IE
    'image/gif' => 1,
    'image/x-gif' => 1 // IE
);


$curDir      = getcwd();
$uploadDir    = '/upload/';

if(isset($_POST['newfounding']) && $_FILES['userfile']['size'] >0 && $_FILES['userfile']['size'] <200000)
{

  if (is_uploaded_file($_FILES['userfile']['tmp_name'])===true)
    {
    $ext = strtolower(pathinfo($_FILES['userfile']['tmp_name'], PATHINFO_EXTENSION));
    $type = $_FILES['userfile']['type'];
   
    if (is_string($ext)===true && is_string($type)===true && $allowedExts[$ext] && $allowedMimes[$type]) {
      $file = md5(uniqid(rand(), true)) . '.jpg';

      if(move_uploaded_file($_FILES['userfile']['tmp_name'], $curDir . $uploadDir . $file))
        {
          mysql_query("INSERT INTO Foundings(picture_url, name, gps, share, users_id, dato, info, type, dane)
          VALUES ('$file', '$foundingname', '$gps', '$share', '$users_id', '$dato', '$info', '$fundtype', '$dane')") or die(mysql_error());
                       
       
            // THUMBNAIL BLIVER LAVET HER:
            $thumbnailDir = '/thumbnails/';
            make_thumbnail(
              $curDir . $uploadDir . $file,
              $curDir . $thumbnailDir,
              0.5
            );
     
      }

      else {
        echo 'Fejl !forkert forma';
        // Ikke en tilladt fil
    }
} else {
    // Ingen fil uploaded
}
}
}



function make_thumbnail($filename, $thumbs_dir, $percent = 0.5)
{
  // her der får du fat i højde og bredde af billedet og skalerer disse værdier:
  list($width, $height) = getimagesize($filename);
  $newwidth = $width * $percent;
  $newheight = $height * $percent;

  // imagecreatetruecolor() laver et nyt resource-object i
  // PHP, en speciel PHP datatype som bruges når man bruger
  // GD lib. $thumb er altså en resource som indeholder
  // en ren data-struktur til et nyt billede - det nye thumbnail
  // billede. Imagecreatefromjpeg() indlæser dit billede
  // som var det JPEG. Her forventes et JPEG billed. Der
  // findes funktioner til indlæsning af andre billede
  // formater. $source er et resource-object som
  // nu indeholder det uploadede billed:
  $thumb = imagecreatetruecolor($newwidth, $newheight);
  $source = imagecreatefromjpeg($filename);

  // Magien ligger i at bruge imagecreateresized().
  // Den modtager de to resource-objekter,
  // pixel koordinater i destination og kilde-billedet (her begge 0,0)
  // og de nye og gamle billede størelser.
  // Det den gør er simpelthen at lave en ny skaleret kopi
  // af det som ligger i $source og gemme det i $thumb.
  imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

  // Her gemmes thumbnail billedet:
imagejpeg($thumb, $thumbs_dir.'thumb_'.basename($filename));
}
Avatar billede olebole Juniormester
14. marts 2012 - 18:15 #10
Prøv lidt almindelig fejlfinding med echo. Gå dine if-sætninger igennem én for en. Efter hver if (BETINGELSE) { echo'er du et par variabler for at se, om betingelsen bliver opfyldt - og om variablerne indeholder det forventede.

Når du kommer til en betingelse, der ikke bliver opfyldt, prøver du lige før betingelsen at echo'e de variabler, der indgår i betingelsen. Husk også at echo'e i hver else.

Så finder du skikkert ret hurtigt årsagen til, at der ikke sker noget
Avatar billede thomasdaco Nybegynder
14. marts 2012 - 18:31 #11
Hej Olebole,

Det er jo også ganske rigtigt, jeg mener ikke at denne If giver det forventet.
For den flytter jo filen, men filen er hedder jo ikke userfile men file... korrrekt ?

  if(move_uploaded_file($_FILES['userfile']['tmp_name'], $curDir . $uploadDir . $file))
Avatar billede olebole Juniormester
14. marts 2012 - 18:39 #12
if(move_uploaded_file($_FILES['userfile']['tmp_name'], $curDir . $uploadDir . $file))

- skal være det navn, dit inputfelt har i formen. Den kan jeg ikke se her  =)
Avatar billede thomasdaco Nybegynder
14. marts 2012 - 21:12 #13
Jo den er fin nok ->
    <td style="WIDTH: 350px"><input type="file" name="userfile" style="width:440px"></TD>


Men jeg kan altså ikke lige se hvorfor mit script ikke bliver udført.
Avatar billede olebole Juniormester
14. marts 2012 - 21:19 #14
Husker du:

<form action="..." enctype="multipart/form-data" method="post" ...>
Avatar billede thomasdaco Nybegynder
15. marts 2012 - 12:11 #15
olebole :)
Jo jo den er der skam :)

Mit script virket også fint i starten, men efter jeg har smeltet dit script ind, så giver køre scriptet bare uden indenhold.
Avatar billede olebole Juniormester
15. marts 2012 - 13:20 #16
Rettelse:

$ext = strtolower(pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION));

$allowedMimes = array(
    'image/jpg' => 1,
    'image/x-jpg' => 1, // IE
    'image/jpeg' => 1,
    'image/x-jpeg' => 1, // IE
    'image/pjpeg' => 1,
    'image/pjpg' => 1, // Progressiv JPG
    'image/png' => 1,
    'image/x-png' => 1, // IE
    'image/gif' => 1,
    'image/x-gif' => 1 // IE
);

- og så skal du lægge din funktion make_thumbnail øverst, så scriptet kan finde den, når den skal bruges. Så burde det virke  =)
Avatar billede thomasdaco Nybegynder
20. marts 2012 - 19:17 #17
Hej olebole, Desværre :(
Jeg får ikke nogen fejl
Avatar billede olebole Juniormester
20. marts 2012 - 19:26 #18
Hvad har du fået ud af at echo'e dig frem? Hvor opstår fejlen?
Avatar billede thomasdaco Nybegynder
15. april 2012 - 00:02 #19
Hej olebole,

Jeg har nu forsøgt at indsætte echoér i mit script, men det vil bare ikke virke, der kommer ikke nogen echoér og mit script virker ikke som tiltænkt.... Hvad er det jeg gør forkert ?.

Lad mig høre fra dig.

Mit script er således ->


$curDir      = getcwd();
$uploadDir    = '/upload/';

if(isset($_POST['newfounding']) && $_FILES['userfile']['size'] >0 && $_FILES['userfile']['size'] <200000)
{
  if (is_uploaded_file($_FILES['userfile']['tmp_name']) === true)
  {
    $ext = strtolower(pathinfo($_FILES['userfile']['tmp_name'], PATHINFO_EXTENSION));
    $type = $_FILES['userfile']['type'];
 
    if (is_string($ext) === true && is_string($type) ===  true && $allowedExts[$ext] && $allowedMimes[$type]) {
      $file = md5(uniqid(rand(), true)) . '.jpg';


            // THUMBNAIL BLIVER LAVET HER:
            $thumbnailDir = '/thumbnails/';
            make_thumbnail(
              $curDir . $uploadDir . $file,
              $curDir . $thumbnailDir,
              0.5
            );

       
      if(move_uploaded_file($_FILES['userfile']['tmp_name'], $curDir . $uploadDir . $file))
        {
          mysql_query("INSERT INTO Foundings(picture_url, name, gps, share, users_id, dato, info, type, dane)
          VALUES ('$file', '$foundingname', '$gps', '$share', '$users_id', '$dato', '$info', '$fundtype', '$dane')") or die(mysql_error());
        }

      else {
        echo 'Fejl ! forkert format';
        // Ikke en tilladt fil
    }
} else {
    echo 'Fejl !';
    // Ingen fil uploaded
}
}
}
Avatar billede olebole Juniormester
15. april 2012 - 00:43 #20
Du kan begynde sådan:

$curDir      = getcwd();
$uploadDir    = '/upload/';

echo '$curDir: '.$curDir.'<br>';
echo '$_POST[\'newfounding\']: '.$_POST['newfounding'].'<br>';
echo '$_FILES: ';
var_dump($_FILES);
echo '<br>';

if(isset($_POST['newfounding']) && $_FILES['userfile']['size'] >0 && $_FILES['userfile']['size'] <200000)
{

- og hvis det ser ud som forventet, må du fortsætte ned gennem scriptet og echo'e alle dine variabler. Det kaldes 'fejlfinding'  *o)
Avatar billede olebole Juniormester
15. april 2012 - 00:48 #21
- og så har du da vist stadig ikke lavet rettelsen i #16:

$ext = strtolower(pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION));
Avatar billede thomasdaco Nybegynder
16. april 2012 - 10:21 #22
Hej Olebole,

Takker for din hurtige respons. Vedr #21 så havde jeg lavet rettelsen men gik tilbage da det ikke virket.. nok pga. en anden fejl :)

Til din besked #20, så har jeg indsat dine Echo, men der kommer bare ikke noget ud. jeg må se om scriptet overhovedet køre :)
Avatar billede olebole Juniormester
16. april 2012 - 10:33 #23
Hvis der ikke bliver skrevet noget ud, er det ikke den side, du står på. Prøv at se efter, hvad står i browserens adresselinje
Avatar billede thomasdaco Nybegynder
16. april 2012 - 13:39 #24
Jeg fandt en fejl på min form side ->
Der manglede name="newfounding"

<input type="submit" name="newfounding" value="Tilføje">

Men det har ikke bevirket at det nu virker.
jeg får samme resultat, den laver ikke nogen fejl men uploader heller ikke noget.
Avatar billede thomasdaco Nybegynder
16. april 2012 - 13:41 #25
Det skal lige siges at jeg har en funktion på en anden side hvor det er muligt at uploade et profil billede.
Det virker fint. Men det er uden at der bliver lavet thumpnail.
Avatar billede olebole Juniormester
16. april 2012 - 15:17 #26
Det kan ikke være rigtigt. Hvis det nu lykkes dig at komme ind på den rigtige side, må du nødvendigvis få echo'et variablerne  =)
Avatar billede thomasdaco Nybegynder
17. april 2012 - 13:22 #27
Jeg har i mit nedestående script en Header til fund.php.
Den bliver kørt før mit script bliver færdigt, hvis jeg vælger at esklude den så får en en del fejl.
Men selve upload scriptet ser sådan her ud ->


//Image upload------------

$allowedExts = array(
    'jpg' => 1,
    'jpeg' => 1,
    'png' => 1,
    'gif' => 1
);

$allowedMimes = array(
    'image/jpg' => 1,
    'image/x-jpg' => 1, // IE
    'image/jpeg' => 1,
    'image/x-jpeg' => 1, // IE
    'image/pjpeg' => 1,
    'image/pjpg' => 1, // Progressiv JPG
    'image/png' => 1,
    'image/x-png' => 1, // IE
    'image/gif' => 1,
    'image/x-gif' => 1 // IE
);

function make_thumbnail($filename, $thumbs_dir, $percent = 0.5)
{
  // her der får du fat i højde og bredde af billedet og skalerer disse værdier:
  list($width, $height) = getimagesize($filename);
  $newwidth = $width * $percent;
  $newheight = $height * $percent;

  // imagecreatetruecolor() laver et nyt resource-object i
  // PHP, en speciel PHP datatype som bruges når man bruger
  // GD lib. $thumb er altså en resource som indeholder
  // en ren data-struktur til et nyt billede - det nye thumbnail
  // billede. Imagecreatefromjpeg() indlæser dit billede
  // som var det JPEG. Her forventes et JPEG billed. Der
  // findes funktioner til indlæsning af andre billede
  // formater. $source er et resource-object som
  // nu indeholder det uploadede billed:
  $thumb = imagecreatetruecolor($newwidth, $newheight);
  $source = imagecreatefromjpeg($filename);

  // Magien ligger i at bruge imagecreateresized().
  // Den modtager de to resource-objekter,
  // pixel koordinater i destination og kilde-billedet (her begge 0,0)
  // og de nye og gamle billede størelser.
  // Det den gør er simpelthen at lave en ny skaleret kopi
  // af det som ligger i $source og gemme det i $thumb.
  imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

  // Her gemmes thumbnail billedet:
imagejpeg($thumb, $thumbs_dir.'thumb_'.basename($filename));
}



$curDir      = getcwd();
$uploadDir    = '/upload/';


echo '$curDir: '.$curDir.'<br>';
echo '$_POST[\'newfounding\']: '.$_POST['newfounding'].'<br>';
echo '$_FILES: ';
var_dump($_FILES);
echo '<br>';

if(isset($_POST['newfounding']) && $_FILES['userfile']['size'] >0 && $_FILES['userfile']['size'] <2000000)
{
  if (is_uploaded_file($_FILES['userfile']['tmp_name']) === true)
  {
    $ext = strtolower(pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION));
    $type = $_FILES['userfile']['type'];
 
    if (is_string($ext) === true && is_string($type) ===  true && $allowedExts[$ext] && $allowedMimes[$type]) {
      $file = md5(uniqid(rand(), true)) . '.jpg';


            // THUMBNAIL BLIVER LAVET HER:
            $thumbnailDir = '/thumbnails/';
            make_thumbnail(
              $curDir . $uploadDir . $file,
              $curDir . $thumbnailDir,
              0.5
            );

       
      if(move_uploaded_file($_FILES['userfile']['tmp_name'], $curDir . $uploadDir . $file))
        {
          mysql_query("INSERT INTO Foundings(picture_url, name, gps, share, users_id, dato, info, type, dane)
          VALUES ('$file', '$foundingname', '$gps', '$share', '$users_id', '$dato', '$info', '$fundtype', '$dane')") or die(mysql_error());
        }

      else {
        echo 'Fejl ! forkert format';
        // Ikke en tilladt fil
    }
} else {
    echo 'Fejl !';
    // Ingen fil uploaded
}
}
}

//header("Location:fund.php");
mysql_close();
ob_flush();   
?>



Warning: getimagesize(): Unable to access /hsphere/local/home/xxxxxxxxxx/ov/upload/8fa8911a602d172922e593cc625ccc5e.jpg in /hsphere/local/home/xxxxxxxxxx/ov/foundings_update.php on line 70
Warning: getimagesize(/hsphere/local/home/xxxxxxxxxx/ov/upload/8fa8911a602d172922e593cc625ccc5e.jpg): failed to open stream: No such file or directory in /hsphere/local/home/xxxxxxxxxx/ov/foundings_update.php on line 70
Warning: imagecreatetruecolor(): Invalid image dimensions in /hsphere/local/home/xxxxxxxxxx/ov/foundings_update.php on line 83
Warning: imagecreatefromjpeg(): Unable to access /hsphere/local/home/xxxxxxxxxx/ov/upload/8fa8911a602d172922e593cc625ccc5e.jpg in /hsphere/local/home/xxxxxxxxxx/ov/foundings_update.php on line 84
Warning: imagecreatefromjpeg(/hsphere/local/home/xxxxxxxxxx/ov/upload/8fa8911a602d172922e593cc625ccc5e.jpg): failed to open stream: No such file or directory in /hsphere/local/home/xxxxxxxxxx/ov/foundings_update.php on line 84
Warning: imagecopyresized(): supplied argument is not a valid Image resource in /hsphere/local/home/xxxxxxxxxx/ov/foundings_update.php on line 92
Warning: imagejpeg(): supplied argument is not a valid Image resource in /hsphere/local/home/xxxxxxxxxx/ov/foundings_update.php on line 95
Avatar billede olebole Juniormester
17. april 2012 - 15:07 #28
Jeg giver op! Vi kan ikke finde fejlen sammen. Skal jeg finde den, er jeg nødt til at sidde med det selv, så jeg objektivt ved, det jeg foreslår, bliver prøvet - og at jeg kender resultatet
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