Jeg gør det ved hjælp af to filer. Den første, som er en ren html fil, indeholder formen hvor du vælger filen via en input field af typen file.
Derudover har jeg i formen lavet en hidden field, med navnet MAX_FILE_SIZE som indeholder den maksimale størrelse den uploadede
fil må have (givet i bytes). Formen's action sætter du til det php script der skal håndtere filupload og database halløjsaet.
Såsom :
<form enctype="multipart/form-data" action="uploaded.php" method="post" onSubmit="return test()">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input name="userfile" type="file" size="30">
..... + html kode der indeholder din formular
</form>
Jeg har i mit script lavet et javascript der sikrer mod forkert indtastede data, idet jeg har flere info jeg føjer til den uploadede fil, såsom
email addresse på hvem der sendte filen. Dem gemmer jeg så sammen med fil info i mysql databasen.
Næste fil indeholder så flere ting. Upload parten er nemmest, idet den egentlig kun består af at flytte filen fra et midlertidigt directory
fra serveren til det sted du vil have den til at ligge. Det gøres med følgende :
if (is_uploaded_file($userfile)) {
if (file_exists($dest)) {
echo("Warning : File already exists. I'm overwriting it!<BR>\n");
}
copy($userfile, $dest);
hvor $dest i mit tilfælde er en strengvariabel der indeholder den komplette sti til hvor filen skal ligge.
Efter at have flyttet filen ind i et directory af eget valg, sender du så en query til mysql manageren. Først åbnes en connection:
$conn_id=mysql_connect($dbhost,$dbuser,$dbpassword);$query="INSERT INTO ".$dbtable."....... (hvad du nu vil indsætte, men stien og filnavnet er en RIGTIG god ide).
$res_id=mysql_query($query);$res_id=mysql_close($conn_id);
På den måde undgår du at gemme filen i mysql databasen som blobs (eller hvad pokker de nu hedder), men kun information omkring
filen, såsom sti og filnavn. Yderligere kan du også gemme andre informationer omkring filen såsom lidt forklarende tekst om hvad det
er for noget, email addresse på afsender etc. Når du nu vil vise linkene på de respective filer der er uploaded, kører du først en ny
query på mysql manageren (de fire ovenstående linier, blot med INSERT INTO... erstattet med SELECT bla bla bla.). Resultatet får du
så ud som en resource givet i $res_id (selfølgelig før du udfører lukke kommandoen). Her kan du så evt. lave en løkke sådan lidt
a la :
$num_rows=mysql_num_rows($res_id);
for($i=0;$i<$num_rows);$i++){
$line=mysql_fetch_row($res_id);
echo("<a href=\"".$line[0].$line[1]."\">".$line[1]."</a>\n");
}
hvor det med dette simple script kræver at første linie i databasen indeholder stien til filen, og næste linie indeholder navnet på filen.
Dette script er ikke helt så sikkert, idet man kan være uheldig at linie 0 kommer ud som filnavnet, og linie 1 er stien (altså lige omvendt,
hvilket ikke er særlig hensigtsmæssigt:), så kan man i sin query indsætte en SORT kommando, så man er sikker på at linie 0 er stien
og linie 1 er filnavnet.
Breaks i filnavnet er ikke noget problem på denne måde idet filnavnet og sti gemmes som text i databasen. Eneste problem er hvis
serveren af en eller anden grund ikke understøtter det.
Håber det hjælper.
Med venlig hilsen Rasmus