webForumDet fria alternativet

Lägga in bilder i databas.

PHPur PHP

11 svar · 1 044 visningar · startad av PiteCarina

PiteCarinaMedlem sedan sep. 200749 inlägg
#1

Hej!
Jag har skapat en hemsida där det ska läggas in erbjudanden. Som det är nu så måste man in i XHTML-koden och fylla i uppgifterna för varje erbjudande.

Har tänkt att skapa ett formulär i PHP, där man kan fylla i uppgifterna i olika textfält och även browsa på hårddisken efter en bildfil. Sedan ska uppgifterna hamna i en databastabell. Det blir mest troligt MySQL som databashanterare.

Jag hade tänkt att själva bildfilen skulle hamna i tabellen, men man ska tydligen lägga in sökvägen i stället? Går det att genom PHP-kommandon få över bildfilen till servern där hemsidans övriga filer ligger? Hemsidan ligger hos Interact. Det handlar om max 20 bilder i storleken 10-20 kB.

Är nybörjare och osäker på hur jag kan och ska gå till väga. Lägga in bilden som fil eller sökväg i databasen? Om bägge sätten fungerar, vilket är enklast att implementera?

Tar tacksamt emot tips!

TulorkMedlem sedan aug. 2004903 inlägg
#2

Det bästa är nog att du vid uppladdningen, skickar bilden till servern i en egen mapp. Du sparar sedan filnamnet i databasen tillsammans med den övriga informationen.

Det vore också en ide att döpa om filnamnet till en alphanumerisk kod. Detta för att om det mot förmodan skule finnas en bild med exakt samma namn, kommer den skrivas över. Hur du än väljer måste du kolla om det finns ett filnamn i mappen som har samma namn som filen du laddade upp.

PiteCarinaMedlem sedan sep. 200749 inlägg
#3

Tack Tulork!
Jag följer ditt råd och lägger bara in filnamnet i databasen.
Nu måste jag bara ta reda på hur jag får över bilden till servern. Antar att det finns något PHP-kommando för det?

Ska även titta på det där med alphanumerisk kod. Jag tror inte det behövs i nuläget, men kanske längre fram? Tack för tipset om att kolla upp om det redan finns en fil med samma namn! Hade inte tänkt på det!

PiteCarinaMedlem sedan sep. 200749 inlägg
#4

Antar att det är move_uploaded_file som jag ska använda för att få över bilden till servern? Hittade denna kod på nätet:

echo "UPPLADDNING AV FIL.";
# Temporärfilnamnet som php tilldelat:
$uploadedFile = $_FILES['userfile']['tmp_name'];
# Flytta filen till testkatalog testkat, och döp den till originalnamnet:
move_uploaded_file ( $uploadedFile,"testkat/".$_FILES['userfile']['name'] );

TulorkMedlem sedan aug. 2004903 inlägg
#5

Liten guid om hur du löser filuppladdning med PHP.

http://www.tizag.com/phpT/fileupload.php

OBS: Tänk på att begränsa vad för filändelser man får ladda upp. Det är väldigt simpelt att kontrollera detta. Ett sätt är att plocka ur allt efter din sista punkten i filnamnet och checka det mot en array med filnamn som du godkänner.

PiteCarinaMedlem sedan sep. 200749 inlägg
#6

Tack igen Tulork! :-)

PiteCarinaMedlem sedan sep. 200749 inlägg
#7

Jag har först nu provat att föra över bildfiler till Interacts server, men det fungerar inte.

Själva filöverföringsbiten i formuläret ser ut så här:

<form method=POST action="registreraDB.php" enctype="multipart/form-data">

Välj bild: <input type="file" name="fil" />

<input type=SUBMIT value="Registrera">
</form>

I registreraDB.php så ser det för tillfället ut så här, i en avskalad version, utan t.ex. koll av filändelser:

$uploaddir = 'bilder/';
$uploadfile = $uploaddir . basename($_FILES['fil']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['fil']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

Det ser rätt ut i $_FILES, men move_uploaded_file($_FILES['fil']['tmp_name'], $uploadfile) returnerar ändå "false"

Så här blev resultatet:

Possible file upload attack!
Here is some more debugging info:Array
(
[fil] => Array
(
[name] => A8E-4P070E.jpg
[type] => image/pjpeg
[tmp_name] => /var/tmp/phpAkCgVK
[error] => 0
=> 9842
)

)

Kan ni se något fel? Kan det vara så att Interact inte tillåter uppladdning av filer?

Är mycket tacksam för hjälp!

PiteCarinaMedlem sedan sep. 200749 inlägg
#8

Har kollat inställningarna hos Interact m.h.a. phpinfo() och problemet verkar inte vara där?

Så jag har nog gjort något fel i kodandet? Men jag har testat olika kodexempel som jag hittat på nätet och mest bara ändrat t.ex. variablelnamn.

Katalogen "bilder" ligger på samma nivå som PHP-filerna i katalogstrukturen. Har provat med $uploaddir = './bilder/'; och även utan bildkatalog.

Är rätt så nybörjare när det gäller PHP och förstår inte varför det blir fel? Har totalt kört fast!

Hoppas det finns någon vänlig själ som kan hjälpa mig!

UrMeMedlem sedan apr. 2001762 inlägg
#9

Du måste inte ha hela sökvägen till bilder katalogen? Vet inte hur det ser ut på Interact men t.ex när jag ftp:ar till Binero så är hela sökvägen så här:

/domains/mindoman.se/public_html/bilder

Var ett tag sedan jag gjorde något upload script i php, så kan ha fel, men ganska säker på att det har med sökvägen att göra till katalogen.

PiteCarinaMedlem sedan sep. 200749 inlägg
#10

Tack UrMe för tipset!
Jag har testat olika varianter på sökvägar nu under helgen, men får det inte att fungera.

Tänkte problemet var att jag försökte lägga in bildfilerna direkt i www.mindomän.se och inte i underkatalogen public_html. Att jag bara hade rättigheter att ladda upp filer i public_html. Men har testat det också.

När jag har uppe FTP-fönstret, så står det ftp://www.mindomän.se, d.v.s. ingenting före mitt domännamn. Ska det ändå finnas något före i sökvägen?

Antar det är sökvägen och inte själva kodningen som är problemet?

Så här ser koden ut nu. Bara mitt domännamn är utbytt (Hur det ser ut i formuläret finns i inlägg 7):

//Hantering av bildfilen

// Skickar bilden till servern
//Väljer vart bilderna ska hamna
$mapp = '/www.mindoman.se/public_html/'; //Har även testat utan "www."

//Lägger in orginalnamnet i en variabel
$filnamn = $_FILES["fil"]["name"];

//Den första siffran är kb, sen hela variabeln ger hur många bytes, vald kb är. I detta fall 51200 bytes.
$max_storlek = 50*1024;

//Väljer vilka filer som kan laddas upp
$mime_typer = array('image/pjpeg', 'image/jpeg', 'image/gif');

//Sätter ihop vald mapp och filnamn
$destination = $mapp.$filnamn;

//echo "Destination";
echo $destination; // Visar : /www.mindomain.se/public_html/F5M-AP046C.jpgTemp

echo "Temp filnamn";
echo $_FILES["fil"]["tmp_name"]; // Visar: /var/tmp/phpBvWSwg som resultat

//Kollar om filen har rätt mime typ samt rätt storlek
if ( in_array ($_FILES["fil"]["type"], $mime_typer) &&
$_FILES["fil"]["size"] <= $max_storlek ) {

//Lägger upp filen där du valt att den ska hamna
$loaded=move_uploaded_file($_FILES["fil"]["tmp_name"], $destination);
if ($loaded){
echo "Din fil laddades upp utan problem";
}
else{
echo "Gick ej att ladda";
}

}

Är mycket tacksam för hjälp!

UrMeMedlem sedan apr. 2001762 inlägg
#11

Scriptet fungerar utan problem för mig, det är sökvägen förmodligen som är fel testa att skriva detta på den sidan du har formuläret:

<?php echo getcwd(); ?>

då ser du hela sökvägen dit scriptet ligger kopiera bara den, se även till att du har skrivrättigheter till katalogen du försöker ladda upp till, så jag föreslår en underkatalog till public_html.

PiteCarinaMedlem sedan sep. 200749 inlägg
#12

Tack UrMe!
Nu äntligen så fungerar det! :-D
Tack vare tipset om getcwd(), så såg jag att jag hade helt galen sökväg!
Du har räddat min vecka!

140 ms totalt · 3 externa anrop · v20260731065814-full.94fcd635
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)