TulorkMedlem sedan aug. 2004903 inlägg Har suttit och kollat igenom rätt många olika inlägg här på WF angående tumnagel skript, men jag har inte lyckats hitta någonting som passar, och har väldigt svårt att bygga ut dem till vad jag behöver av någon anledning.
Vad jag är ute efter är att när man väljer att ladda upp en bild ska bilden i originalformat sparas i en mapp med ett framgenererat filnamn. Filnamnet ska sedan in i databasen. Samtidigt som detta ska en tumnagel genereras av bilden som sedan ska sparas i en annan mapp och med ett unikt filnamn som även det ska in i databasen.
Den genererade tumnagelbilden får inte ha dimensionsproblem (vet inte om det går att ordna)... vad jag menar med dimensionsproblem är att en bild som original är 1024x768 ska bebålla dess dimensionsförhållanden vid förminskningen.
Hur löser jag detta bäst?
PeddaMedlem sedan juni 20006 032 inlägg Postar ett exempel som jag har använt mig av.
Den genererar inte slumpade filnamn, men det får du fixa.
Om bredden på bilden är över 200px (variabeln $nybredd) så skalas bilden om.
Så en originalbild på 400*200 så blir tumnageln alltså 200*100
eller en originalbild på 400*800 blir 200*400
<?php
//###################################
$mapp = "../produktbilder"; // Mappen där logon ska sparas
$nybredd = 200; // Bredd som bilden ska ha i pixlar
$kompression = 100; // Vilken komprimering (100=ingen)
//###################################
// ladda upp ny bild
if (!empty($_FILES['file']['name'])) {
if (is_uploaded_file($_FILES['file']['tmp_name'])) {
$bildnamn = $_FILES['file']['name'];
$tempnamn = $_FILES['file']['tmp_name'];
$filandelse = strtolower(substr($bildnamn, (strrpos($bildnamn, '.'))));
$bildstrl = getimagesize($tempnamn);
// Ta bort mellanslag
$bildnamn = str_replace(' ', '_', $bildnamn);
// Ta bort å
$bildnamn = str_replace('å', 'a', $bildnamn);
// Ta bort ä
$bildnamn = str_replace('ä', 'a', $bildnamn);
// Ta bort ö
$bildnamn = str_replace('ö', 'o', $bildnamn);
// Kolla filen så det är en bild
if (($_FILES['file']['type'] != "image/gif") && ($_FILES['file']['type'] != "image/jpeg") && ($_FILES['file']['type'] != "image/png") && ($_FILES['file']['type'] != "image/pjpeg")) {
echo "Bilden måste vara av typen gif, jpg, jpeg eller png!";
exit;
}
// Ändra storleken om bilden är större än $nybredd
if ($nybredd < $bildstrl[0]) {
$nyhojd = ceil(($nybredd / $bildstrl[0]) * $bildstrl[1]);
// Gör om bildens storlek
$nybild = imagecreatetruecolor($nybredd, $nyhojd);
// Kontrollera vilken bildtyp det är (1=gif , 2=jpg , 3=png)
switch($bildstrl[2]) {
case 1:
$bild = imagecreatefromgif($tempnamn);
break;
case 2:
$bild = imagecreatefromjpeg($tempnamn);
break;
case 3:
$bild = imagecreatefrompng($tempnamn);
break;
}
imagecopyresampled($nybild, $bild, 0, 0, 0, 0, $nybredd, $nyhojd, $bildstrl[0], $bildstrl[1]);
// Kopiera bilden till sin mapp
$sparabild = $mapp . '/' . $bildnamn;
imagejpeg($nybild, $sparabild, $kompression);
// Frigör minne som associerats med bilderna
imagedestroy($bild);
imagedestroy($nybild);
// In i databasen
mysql_query("UPDATE produkter SET bild='$bildnamn' WHERE p_id = '{$_POST['id']}'");
} else {
move_uploaded_file($tempnamn, $mapp . '/' . $bildnamn);
// In i databasen
mysql_query("UPDATE produkter SET bild='$bildnamn' WHERE p_id = '{$_POST['id']}'");
}
}
}
?>
TulorkMedlem sedan aug. 2004903 inlägg men då blir väl inte alla tumnaglar lika stora?
PeddaMedlem sedan juni 20006 032 inlägg
Tulork skrev:
men då blir väl inte alla tumnaglar lika stora?
Tulork skrev:
Den genererade tumnagelbilden får inte ha dimensionsproblem (vet inte om det går att ordna)... vad jag menar med dimensionsproblem är att en bild som original är 1024x768 ska bebålla dess dimensionsförhållanden vid förminskningen.
Du ville ju att dom skulle behålla dimensionsförhållandena.
Med mitt exempel så blir alla bilder 200px breda medans höjden justeras efter förhållandena.
Hur vill du annars ha det?
TulorkMedlem sedan aug. 2004903 inlägg Om en bild var mindre än en viss bredd, höjd så fylls resterande yta ut en vit ram eller nått. Men det du skickade fungerar utmärkt. Tack ska du ha ;
PeddaMedlem sedan juni 20006 032 inlägg Konstigt.
Om bilden är mindre så ska den bara flyttas som den är. Funkar så för mig, alltså ingen vit ram här. Det är ju det den sista else gör.
TulorkMedlem sedan aug. 2004903 inlägg nä alltså, jag har inte testat scriptet än :) det var bara jag som tänkte högt.
Skulle även behöva spara originalbilden i en egen mapp föresten.
PeddaMedlem sedan juni 20006 032 inlägg Ok, trodde att du hade testat och fick en vit ram.
Originalbilden är det ju bara att flytta till rätt mapp.
Lägg till move_uploaded_file() med sökvägen till rätt mapp bara inne i både if-satsen och i else-satsen.
move_uploaded_file($tempnamn, 'originalbilder/' . $bildnamn);
red/
om bilden har en bredd på under 200px (alltså det värde du anger på $nybredd) så ändras inte storleken i scriptet, utan den flyttas bara till mappen med tumnaglar som den är.
TulorkMedlem sedan aug. 2004903 inlägg hmm, är lite osäker på hur formuläret ska se ut för själva uppladdningen
PeddaMedlem sedan juni 20006 032 inlägg <form action="filen.php" method="post" enctype="multipart/form-data" name="upload" id="upload">
<input name="file" type="file" size="30" />
<input type="submit" name="nyBild" value="Ladda upp" />
</form>
Observera att du måste ha enctype="multipart/form-data"
TulorkMedlem sedan aug. 2004903 inlägg Hänger inte riktigt med på det du skrev om att flytta originalbilden. Med originalbild menar jag de dimensionerna som bilden hade innan jag laddade upp den.
om jag flyttar med den kodbiten du gav mig flyttar jag bara tumnagelbilden igen.
PeddaMedlem sedan juni 20006 032 inlägg Nej, den ska spara en ny bild i mappen "originalbilder".
Finns mappen?
Komplett kod:
<?php
//###################################
$mapp = "thumbs"; // Mappen där tumnageln ska sparas
$original = "originalbilder"; // Mappen där originalbilden sparas
$nybredd = 200; // Bredd som bilden ska ha i pixlar
$kompression = 100; // Vilken komprimering (100=ingen)
//###################################
// ladda upp ny bild
if (!empty($_FILES['file']['name'])) {
if (is_uploaded_file($_FILES['file']['tmp_name'])) {
$bildnamn = $_FILES['file']['name'];
$tempnamn = $_FILES['file']['tmp_name'];
$filandelse = strtolower(substr($bildnamn, (strrpos($bildnamn, '.'))));
$bildstrl = getimagesize($tempnamn);
// Ta bort mellanslag
$bildnamn = str_replace(' ', '_', $bildnamn);
// Ta bort å
$bildnamn = str_replace('å', 'a', $bildnamn);
// Ta bort ä
$bildnamn = str_replace('ä', 'a', $bildnamn);
// Ta bort ö
$bildnamn = str_replace('ö', 'o', $bildnamn);
// Kolla filen så det är en bild
if (($_FILES['file']['type'] != "image/gif") && ($_FILES['file']['type'] != "image/jpeg") && ($_FILES['file']['type'] != "image/png") && ($_FILES['file']['type'] != "image/pjpeg")) {
echo "Bilden måste vara av typen gif, jpg, jpeg eller png!";
exit;
}
// Ändra storleken om bilden är större än $nybredd
if ($nybredd < $bildstrl[0]) {
$nyhojd = ceil(($nybredd / $bildstrl[0]) * $bildstrl[1]);
// Gör om bildens storlek
$nybild = imagecreatetruecolor($nybredd, $nyhojd);
// Kontrollera vilken bildtyp det är (1=gif , 2=jpg , 3=png)
switch($bildstrl[2]) {
case 1:
$bild = imagecreatefromgif($tempnamn);
break;
case 2:
$bild = imagecreatefromjpeg($tempnamn);
break;
case 3:
$bild = imagecreatefrompng($tempnamn);
break;
}
imagecopyresampled($nybild, $bild, 0, 0, 0, 0, $nybredd, $nyhojd, $bildstrl[0], $bildstrl[1]);
// Kopiera bilden till sin mapp
$sparabild = $mapp . '/' . $bildnamn;
// Skapa tumnageln
imagejpeg($nybild, $sparabild, $kompression);
// Frigör minne som associerats med bilderna
imagedestroy($bild);
imagedestroy($nybild);
// Flytta originalbilden
move_uploaded_file($tempnamn, $original .'/' . $bildnamn);
// In i databasen
mysql_query("UPDATE produkter SET bild='$bildnamn' WHERE p_id = '{$_POST['id']}'");
} else {
// Flytta originalbilden
move_uploaded_file($tempnamn, $original .'/' . $bildnamn);
// Flytta den även till mappen med tumnaglar
move_uploaded_file($tempnamn, $mapp . '/' . $bildnamn);
// In i databasen
mysql_query("UPDATE produkter SET bild='$bildnamn' WHERE p_id = '{$_POST['id']}'");
}
}
}
?>
TulorkMedlem sedan aug. 2004903 inlägg Det löste sig, fick hjälp av en annan. :)
PeddaMedlem sedan juni 20006 032 inlägg Testade koden och den funkar här hos mig iaf. :)
colioneMedlem sedan juni 20014 421 inlägg Kan du posta koden som löste det hela? :)
TulorkMedlem sedan aug. 2004903 inlägg Det kan jag väl :)
<?php
include("setts/conn.php");
//###################################
$thumb = "pic/thumb"; // Mappen där thumbnails ska sparas
$original = "pic/original"; // Mappen där originalbilden ska sparas
$nybredd = 100; // Bredd som bilden ska ha i pixlar
$kompression = 100; // Vilken komprimering (100=ingen)
//###################################
?>
<form action="test.php" method="post" enctype="multipart/form-data" name="upload" id="upload">
<input name="file" type="file" size="30" />
<input type="submit" name="nyBild" value="Ladda upp" />
</form>
<?php
// ladda upp ny bild
if (!empty($_FILES['file']['name'])) {
if (is_uploaded_file($_FILES['file']['tmp_name'])) {
$bildnamn = $_FILES['file']['name'];
$tempnamn = $_FILES['file']['tmp_name'];
$filandelse = strtolower(substr($bildnamn, (strrpos($bildnamn, '.'))));
$bildstrl = getimagesize($tempnamn);
//slumpar fram ett filnamn
include ("setts/filnamns_generator.php");
$bildnamn = $u;
// Kolla filen så det är en bild
if (($_FILES['file']['type'] != "image/gif") && ($_FILES['file']['type'] != "image/jpeg") && ($_FILES['file']['type'] != "image/png") && ($_FILES['file']['type'] != "image/pjpeg")) {
echo "Bilden måste vara av typen gif, jpg, jpeg eller png.<br />
Filändelser med stora bokstäver accepteras inte";
exit;
}
// Ändra storleken om bilden är större än $nybredd
if ($nybredd < $bildstrl[0]) {
$nyhojd = ceil(($nybredd / $bildstrl[0]) * $bildstrl[1]);
// Gör om bildens storlek
$nybild = imagecreatetruecolor($nybredd, $nyhojd);
// Kontrollera vilken bildtyp det är (1=gif , 2=jpg , 3=png)
switch($bildstrl[2]) {
case 1:
$bild = imagecreatefromgif($tempnamn);
break;
case 2:
$bild = imagecreatefromjpeg($tempnamn);
break;
case 3:
$bild = imagecreatefrompng($tempnamn);
break;
}
imagecopyresampled($nybild, $bild, 0, 0, 0, 0, $nybredd, $nyhojd, $bildstrl[0], $bildstrl[1]);
// Kopiera bilden till sin mapp
$bild_namn = "$bildnamn$filandelse";
$sparabild = $thumb . '/' . $bild_namn;
imagejpeg($nybild, $sparabild, $kompression);
//Flyttar orginalbilden till rätt mapp
$bild_namn = "$bildnamn$filandelse";
move_uploaded_file($tempnamn, $original . '/' . $bild_namn);
$doit = "INSERT INTO annons (thumb, original) VALUES ('$bildnamn$filandelse', '$bildnamn$filandelse')";
$now = mysql_query($doit) or die ('Ett fel har uppstått');
// Frigör minne som associerats med bilderna
imagedestroy($bild);
imagedestroy($nybild);
} else {
move_uploaded_file($tempnamn, $thumb . '/' . $bild_namn);
copy ($thumb . '/' . $bild_namn, $original . '/' . $bild_namn);
$doit = "INSERT INTO annons (thumb, original) VALUES ('$bildnamn$filandelse', '$bildnamn$filandelse')";
$now = mysql_query($doit) or die ('Ett fel har uppstått');
}
}
}
?>
Ett problem som återstår dock... Den gnäller på bilder som använder sig av stora filändelser... jpg, png, gif funkar...... JPG, PNG, GIF fungerar inte.
PeddaMedlem sedan juni 20006 032 inlägg
Tulork skrev:
Ett problem som återstår dock... Den gnäller på bilder som använder sig av stora filändelser... jpg, png, gif funkar...... JPG, PNG, GIF fungerar inte.
Trodde att dom hade samma mimi-type.
Testa att lägga till att den ska skriva ut vilken mime-type det är. Ladda upp en fil som inte godkänns och kolla.
Du kan ju lägga till fler mime-typer i kontrollen som ska godkännas.
TulorkMedlem sedan aug. 2004903 inlägg Har gjort så här
if (($_FILES['file']['type'] != "image/gif") && ($_FILES['file']['type'] != "image/GIF") && ($_FILES['file']['type'] != "image/jpg") && ($_FILES['file']['type'] != "image/JPG") && ($_FILES['file']['type'] != "image/jpeg") && ($_FILES['file']['type'] != "image/JPEG") && ($_FILES['file']['type'] != "image/png") && ($_FILES['file']['type'] != "image/PNG") && ($_FILES['file']['type'] != "image/PJPEG") && ($_FILES['file']['type'] != "image/pjpeg")) {
echo "Bilden måste vara av typen gif, jpg, jpeg eller png.<br />";
exit;
}
Den klagar på allt utom jpg verkar det som.. jag har testat skriva ut $_FILES['file']['type'], men den säger inget.. har även provat dem separat.. det ända jag fått fram är att den skriver ut Array..
TulorkMedlem sedan aug. 2004903 inlägg Nått tips jag kan prova, några fel ni ser...? kanske är det vår utvecklingsserver som saknar nått i biblioteket vad gäller bildhantering..?
TulorkMedlem sedan aug. 2004903 inlägg .gif funkar, likaså .jpg.. det är .png den inte vill ha nått att göra med.. kan det bero på någon php inställning på servern, eller apache?