07. juli 2006 - 09:56Der er
28 kommentarer og 1 løsning
Fil til mySQL
Hej eksperter,
Jeg er i gang med dette site hvor man får mulighed for at uploade sine billeder, film og andre filer, og problemet heraf er, at man skal have mulighed for at gøre sine uploadede filer private, og der skal derfor ikke være nogen mulighed overhovedet for at kunne komme i kontakt med disse filer.
Derfor tænkte jeg på om det ikke er muligt at smide filer ind i en mySQL database, og gemme dem der og sørge for at de kun er tilgængelige for brugeren selv?
"Bare sørg for de ikke er tilgængelige over http:// uden de tilgåes gennem din lille service der henter og sender filerne til brugeren." Hvordan gøres dette? Evt. et link, eller navn på denne funktion =)
Synes godt om
Slettet bruger
07. juli 2006 - 12:33#4
Du kan enten lægge filerne uden for den mappe som webserveren bruger, eller sætte webserveren til ikke at servere filer fra den pågældende mappe. Det sidste gøres med en .htaccess fil.
Man kan også lægge selve filindholdet ind i databasen, men ofte er det nemmere med filer.
Uanset hvilken af de to metoder, du vælger, skal du bruge et lille script, som vi kan kalde viewfile. Det skal have overført en parameter, som identificerer filen, og så skal den sætte en passende mimetype og outputte selve filen.
Mimetypen sættes med: header("Content-Type: " . $row['type']); // type kommer fra databasen
Og filen outputtes med enten (for filer): readfile($filnavn);
eller for database: echo $row['indhold'];
Bemærk forresten at nogle servere er sat op til at output fra db får sat slashes. Hvis det er tilfældet skal du fjerne dem med stripslashes() før du benytter værdierne fra databasefelterne.
sandbox > Er kun halvt med =/ htacces, og Mimetype =S
Ved ikke rigtig hvordan det skal hænge sammen.
Synes godt om
Slettet bruger
07. juli 2006 - 14:00#6
.htaccess er en fil, som kan angive specielle webserverindstillinger for en mappe (og dens undermapper) således at ejeren af den mappe kan lave om på de indstillinger uden at man behøver at give ham lov til at rette i selve serverens indstillinger. Og ja, filnavnet starter med et punktum.
Mimetype er en simpel stump tekst, som fortæller, hvilken filtype, der er tale om. Her er et par eksempler på ofte anvendte typer:
Sorry - er ret træt, derfor langsomt opfattende. Men jeg forstår det som at jeg skal lave en fil der hedder .htaccess hvor der står "header("Content-Type: " . text/html);"
også mysql_query(); og hente filen.
Men hvordan hentes filen så ned i f.eks. index.php.php hvis allow = 1?
Ved godt hvordan man henter ned, men forstår bare ikke sammenhængen mellem .htaccess og index.php
Synes godt om
Slettet bruger
08. juli 2006 - 00:17#8
.htaccess-filen har ikke (i denne forbindelse) nogen sammenhæng med minetypes. Den fortæller bare selve webserveren, at den ikke må "udlevere" filerne i mappen. Den skal altså kun bruges hvis man vælger at have filerne liggende som egentlige filer på harddisken.
Mimetype er til gengæld det, som fortæller brugerens browser, hvad det er for en slags fil, han er ved at hente, så den ved, hvordan filen skal vises, og evt. hvilket plugin eller eksternt program, filen skal sendes videre til. Den skal bruges uanset hvilken metode, du bruger til at gemme filerne.
Når du modtager en fil (altså i upload-scriptet), skal du finde ud af, hvilken mime-type, filen er og gemme det i databasen sammen med enten selve filindholdet eller navnet på filen i den mappe, som serveren ikke udleverer filer fra. PHP har en funktion http://dk.php.net/mime_content_type som ud fra en fil kan give et godt bud på filens type. Bemærk, at den funktion kigger på filens faktiske indhold og endelsen på filnavnet har ikke indflydelse på det. (Og det kan være lidt forskelligt hvilke filtyper den kan genkende.)
Når brugeren så beder om filen igen, skal du slå op i databasen for at finde filen og se, om brugeren har lov til at se filen. Der henter du samtidig den tidligere gemte oplysning om mimetypen ud, og lige før du sender selve filen til brugeren, skal du så bruge den header-kommando.
Ville nu have lavet en .htaccess til hvert bibliotek for hver bruger.... Så er man uden om problemet med at lave en "download.php" og content type osv...
Kan du også lave i .htaccess, allow from all eller lave et subdir du kalder public, som har almindelige rettigeheder, som så folk kan flytte filen over i.
iss > Det ville tage RIGTIG meget trafik =) Så holder mig til den første, men er det bare deny from all og allow from none som jeg skal smide i min .htaccess?
Nej det er rigtigt, tænkte på når filerne skulle flyttes, men det hele sker jo på serveren, så jeg tænkte mig bare ikke om =) Men holder mig til at alle filer ligger i en mappe, og skal ses fra sitet, altså kan man ikke bare se dem for sig selv.
iss jeg skylder dig forresten point for mit "email tjeck" spørgsmål, jeg oprettede for nogle dage sidenl Smid er svar: http://www.eksperten.dk/spm/718765
Så vil jeg nok sige... installere en rigtig webserver (Apache)...
Synes godt om
Slettet bruger
08. juli 2006 - 23:48#26
Hvis du har dine ting liggende på et webhotel, så er det ikke sikkert, at du kan benytte .htaccess-filer. (Det vil så efter min mening være et yderst ringe hotel.)
Har du en mappe, som ligger uden for det område, der kan vises af webserveren, så kan du lægge filerne der i stedet.
Og du bad om et svar, så det lægger jeg nu.
Synes godt om
Slettet bruger
08. juli 2006 - 23:49#27
Og ellers er der stadig muligheden med at putte selve filindholdet i databasen. Så har du ikke brug for .htaccess-filen.
Når du har strengen kan den indsættes i databasen, hvis den ikke er større end databasefeltet er sat til. Feltet skal være af typen BLOB.
Da PHP kan være sat op til at sætte backslashes i strengen under indlæsning, kan det være en god ide at omgå dette. Her er lidt kode:
$gammelindstilling = ini_set("magic_quotes_runtime", "0"); // slår backslashes fra $mimetype = mime_content_type($filnavn); // finder filtypen $filindhold = file_get_contents($filnavn); // indlæser filen $filindhold = mysql_real_escape_string($filindhold); // sikrer mod SQL-injection ini_set("magic_quotes_runtime", $gammelindstilling); // sætter backslashes til opr. unlink($filnavn); // sletter filen
Efter disse kommandoer skal du bare indsætte i databasen som normalt.
I udskrift-skriftet, skal du igen omgå backslashes, hvis PHP sætter dem. Denne linie udskriver filindholdet, og fjerner samtidig backslashes, hvis PHP er sat til at tilføje dem:
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.