04. juli 2005 - 11:45Der er
25 kommentarer og 1 løsning
Upload med link i MySQL.
Jeg har en upload side skrevet i PHP og en MySQL database.
Som det står nu kan man logge ind via et brugernavn og password og uploade filer til en mappe på webserveren. Disse filer er så alle synlige for dem der logger ind (Dvs. filerne bliver bare uploadet uden nogen ref til den pågældende bruger).
Hvordan kan jeg få lavet sådan at filen bliver hæftet til brugeren, dvs. når brugeren er logget ind er kun de filer han har uploadet synlige..
Når du oploader så skal den sende forfatteren til mysql. Og bruger du bare WHERE forfatter = "bruger" hvis du bruger en mysql query til at hente listen ud med
Ja, og der skriver du intet ind i databasen. Derfor ser jeg 2 løsningsforslag. Jeg går ud fra, at hver bruger har et brugerid i din database? Så kan du enten vælge at oprette en mappe med brugeres id, og så kun lægge filerne ind, så hver bruger har hver sin mappe på serveren, eller starte med at indsætte det hele i en tabel, så du kan se hvilke filnavne der tilhører hvilke brugere...
Tjoh muligvis, men hvis mappen eksisterer så kan den jo ikke oprettes igen. Jeg synes du skulle teste det, før du spørger - for jeg ved ikke 100% hvordan den reagerer. Kan ikke se, at der skulle være noget galt i at den forsøger at oprette hver gang...
Jeg kan se at min server kører apache, så dvs. hvis man blot indtaster mappe navnet i addresse feltet, så har man adgang til alle filerne.. Hvordan kan man lukke for dette, uden at det påvirker logon-scriptet.. For rettighederne for mappen skal jo være 777 (jeg bruger bare ftp:// i eksplorer. Her vælger jeg egenskaber for mapperne og angiver at alle brugere skal have skrive, læse, og eksekverbar adgang)
CHMOD'ingen (altså skrive/læserettigheder) har ingenting at gøre med at du kan se filerne bare ved at indtaste adressen. Der skal du vist have fat i en .htaccess-fil eller selve config-filen til Apache for at ændre det, men jeg kan dog ikke lige huske den var der skal ændres.
Men hvad mener du med, hvordan du får det vist på din side? Mener du sådan, at brugeren kun kan se sine egne filer?
Ja, altså at brugeren kun kan se sine egne filer..
Det jeg mener med CHMOD : Problemet er at når der peges på en fil, viser browseren stien for filen, altså også hvilken mappe den ligger i. Hvis vi nu siger at den mappe alle filer ligger i kaldes for "uploadmappe" så står der nede i stien : http://www.minhjemmeside.dk/uploadmappe/filnavn.doc Det er jo ikke så godt, for hvis man i apache indtaster følgende i addresse linjen :
Får du alle de filer som er tilgængelig frem i en liste som du frit kan downloade. Så ryger jo hele ideen med at folk kan logge ind osv. Man kan lukke for denne mulighed for at sætte bruger-rettigheder, men så virker upload scriptet ikke når man ændrer på mappe-indstillingerne..
Jeg tror du blander mappeindstillinger og dit problem sammen, gør du ikke?! Jeg tror at du kan angive i http.conf eller hvad den hedder i Apache eller i en .htaccess at hvis du ikke angiver en fil med endelse f.eks. .php eller .html så skal den afspærre adgangen...
Hvad angår dit andet problem, så skal du jo nu bare udhente alle filnavne fra din tabel, hvor brugerid'et er det samme som den person der er logget ind, altså:
mysql_query("SELECT filnavn FROM tabel WHERE brugerid = '".$_SESSION['brugerid']."'");
Nu ved jeg hvorfor jeg er så forvirret. For hentede et upload script til at starte med som virkede uden tilgang til database. Det har jeg så ændret til at det også passer med database tilgang. Det script jeg bruger går ind og henter oplysningerne fra den pågældende mappe, og udskriver filerne derfra. Man har så mulighed for at slette, og omdøbe filerne. Da den henter alle filerne ud direkte fra mappen og udskriver dem, skal den have læse adgang til mappen. Hvis man giver mappen læseadgang (jeg hoster hos surftown.dk), så har alle mulighed for at se alle filerne i mappen blot ved at indtaste det jeg skrev.. Men selvfølgelig skal den ikke vise alle filerne i mappen, men derimod hente dem fra databasen, det har du fuldstændig ret i!.. Men hvordan kan man så slette filerne fra mappen ??
For at slette filer kan du bruge unlink(); - men det kræver også fuld adgang til mappen. Og igen vil jeg godt lige pointere, at jeg tror du misforstår noget. Du bør undersøge, om fjernelse af CHMOD'ingen virkelig vil skjule filerne for brugerne...
Sletning af en fil bør f.eks. bare være: unlink("/".$mappe."/".$filnavn);
det kan godt være jeg misforstår nu.. Jeg forbinder CHMOD med de rettigheder man sætter for mapper og filer.. Altså hvis man vælger egenskaber for mapper (i en ftp) kan man sætte om de forskellige brugere skal have skrive/læse rettigheder osv..
Ja, det er netop også hvad CHMOD betyder, men jeg tror bare ikke, at det har noget at gøre med hvorvidt brugerne kan se de filer der ligger i mappen ved bare at indtaste mappenavnet eller ej - men det kan du jo altid oprette et nyt spørgsmål med.
Filstørrelsen kan du få ved at bruge filesize(), f.eks.
men skal den gemmes med i databasen!?? Eller hvordan kan jeg skrive filstørrelsen ud på de enkelte filer når de vises på siden for den pågældende bruger!?
Når jeg vil slette en fil, har jeg lavet et link i html :
<a href="java script:if(confirm('Do you want to delete <?=$filnavn;?>?')) location.href='<?=$_SERVER['PHP_SELF'];?>?method=delete&file=<?=$filnavn;?>';">slet</a></td>
også den "funktion som sletter"
if($_GET['method'] == "delete" && $_GET['file']) { $sql = "DELETE FROM filer WHERE filnavn='".$_GET['file']."'"; $result2 = mysql_query($sql) or die('Login failed. Go back and try again!'); @unlink($mappe."/".$_GET['file']); }
Er der en måde at gøre dette lidt mere optilmalt på? Syntes ikke det virker helt godt! For når man trykker på slet, bliver filen slettet med filnavnet bliver stadigvæk stående.. Først når man trykker på opdater browseren at det forsvinder under listen..
Så vil jeg mene, at den bedste måde er at lægge det i en ny fil. Altså linket:
<a href="java script:if(confirm('Do you want to delete <?=$filnavn;?>?')) location.href='delete.php?method=delete&file=<?=$filnavn;?>';">slet</a></td>
Og i delete.php: <? $mappe = "mappenavn"; if($_GET['method'] == "delete" && isset($_GET['file']) && !empty($_GET['file'])) { $sql = "DELETE FROM filer WHERE filnavn='".$_GET['file']."'"; $result2 = mysql_query($sql) or die('Login failed. Go back and try again!'); @unlink($mappe."/".$_GET['file']); header("Location: side.php"); //skift side.php til navnet på den side du i virkeligheden har exit; } ?>
Forståeligt? ;) For så opdaterer den nemlig siden i samme omgang...
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.