Avatar billede zurekk Nybegynder
07. juli 2006 - 09:56 Der 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?

(andre foreslag er velkomne)

På forhånd tak.
Avatar billede iss Novice
07. juli 2006 - 09:58 #1
Det kan du godt, men ville det ikke være nemmere at oprettet et bibliotek til hver bruger?
Avatar billede jokkejensen Novice
07. juli 2006 - 10:50 #2
Lig filnavnet i databasen, og filerne uden for iis/apache..

I databasen kan du så kæde brugerne og filerne sammen, markerer dem til "private" eller ej mm..

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.
Avatar billede zurekk Nybegynder
07. juli 2006 - 11:36 #3
"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 =)
Avatar billede 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.
Avatar billede zurekk Nybegynder
07. juli 2006 - 13:35 #5
sandbox >
Er kun halvt med =/
htacces, og Mimetype =S

Ved ikke rigtig hvordan det skal hænge sammen.
Avatar billede 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:

text/plain
Simpel tekstfil.

image/gif
Et gif-billede

text/html
En html-fil
Avatar billede zurekk Nybegynder
07. juli 2006 - 15:52 #7
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
Avatar billede 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.
Avatar billede zurekk Nybegynder
08. juli 2006 - 11:18 #9
Ahh, ja det virker jo meget simpelt.

Så mangler jeg bare commandoen som skal smides i .htaccess, hvis du
ikke lige husker den så bare glem det, du har hjulpet mig nok =)

Smid et svar.

Og tak for hjælpen!
Avatar billede iss Novice
08. juli 2006 - 11:46 #10
deny from all
allow from none
Avatar billede iss Novice
08. juli 2006 - 11:48 #11
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...
Avatar billede zurekk Nybegynder
08. juli 2006 - 12:07 #12
iss
Forstår jeg ikke =)
Så ville det jo KUN være brugeren selv som kan se, men det skal også være muligt for brugeren at smide sin filer ud 'public'.
Avatar billede iss Novice
08. juli 2006 - 12:13 #13
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.
Avatar billede zurekk Nybegynder
08. juli 2006 - 12:34 #14
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?
Avatar billede iss Novice
08. juli 2006 - 12:47 #15
Ikke mere end andre løsninger... Hvorfor skulle flere hente det???

Du lægger det i den .htaccess som ligger i det bibliotek du ikke vil have andre skal kunne hente fra.
Avatar billede zurekk Nybegynder
08. juli 2006 - 13:35 #16
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.
Avatar billede zurekk Nybegynder
08. juli 2006 - 13:41 #17
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
Avatar billede zurekk Nybegynder
08. juli 2006 - 13:44 #18
deny from all
allow from none

virker ikke.
Avatar billede iss Novice
08. juli 2006 - 13:53 #19
Jo det gør...
Avatar billede zurekk Nybegynder
08. juli 2006 - 13:57 #20
Nej =)
Har smidt det i en mappe med en masse billeder, og jeg kan uden problemer se de billeder.
Avatar billede iss Novice
08. juli 2006 - 14:01 #21
Og du har lagt filen .htaccess i samme bibliotek?
Avatar billede zurekk Nybegynder
08. juli 2006 - 14:27 #22
I samme mappe ja.

.htaccess
hej.gif
lort.gif
prut.gif
osv. osv.
Avatar billede iss Novice
08. juli 2006 - 15:16 #23
Og dine andre .htaccess filer virker?
Avatar billede zurekk Nybegynder
08. juli 2006 - 15:45 #24
Jeg har ingen andre ^_^
Har aldrig brugt htaccess før, derfor jeg skal have skåret tingene ud i pap =9
Avatar billede iss Novice
08. juli 2006 - 16:05 #25
Så vil jeg nok sige... installere en rigtig webserver (Apache)...
Avatar billede 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.
Avatar billede 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.
Avatar billede zurekk Nybegynder
10. juli 2006 - 08:26 #28
Men jeg fandt aldrig ud af hvordan de smides direkte i databasen =)
Avatar billede Slettet bruger
10. juli 2006 - 12:36 #29
Med funktionen file_get_contents kan du indlæse en fils indhold til en streng. http://dk.php.net/manual/da/function.file-get-contents.php

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:

echo get_magic_quotes_runtime()?stripslashes($row['filindhold']):$row['filindhold'];
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