Avatar billede nima Nybegynder
04. juli 2005 - 11:45 Der 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..

På forhånd tak
Nima
Avatar billede mewm Nybegynder
04. juli 2005 - 12:07 #1
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
Avatar billede nima Nybegynder
04. juli 2005 - 12:58 #2
Som det er nu, bliver alle filer uploadet til en bestemt mappe..



      $file_array = $HTTP_POST_FILES['file'];
      $_SESSION['message'] = "";
      $uploads = false;
      for($i = 0 ; $i < $files_to_upload; $i++)
      {
        if($_FILES['file']['name'][$i])
        {
          $uploads = true;
          if($_FILES['file']['name'][$i])
          {
            $file_to_upload = $**UPLOADMAPPE**."/".$_FILES['file']['name'][$i];
            move_uploaded_file($_FILES['file']['tmp_name'][$i],$file_to_upload);
            chmod($file_to_upload,0777);
            $_SESSION['message'] .= $_FILES['file']['name'][$i]." uploaded.<br>";
          }
        }
      }
      if(!$uploads)  $_SESSION['message'] = "No files selected!";
    }
Avatar billede jaw Nybegynder
04. juli 2005 - 13:45 #3
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...

Sidste løsning, kunne måske se ud noget a'la:
Avatar billede jaw Nybegynder
04. juli 2005 - 13:46 #4
Ja, og der kom mit forslag så ikke med, så prøver lige igen:

      $file_array = $HTTP_POST_FILES['file'];
      $_SESSION['message'] = "";
      $uploads = false;
      for($i = 0 ; $i < $files_to_upload; $i++)
      {
        if($_FILES['file']['name'][$i])
        {
          $uploads = true;
          if($_FILES['file']['name'][$i])
          {
            $file_to_upload = $**UPLOADMAPPE**."/".$_FILES['file']['name'][$i];
            move_uploaded_file($_FILES['file']['tmp_name'][$i],$file_to_upload);
            chmod($file_to_upload,0777);
            mysql_query("INSERT INTO tabel (filnavn, brugerid) VALUES ('$file_to_upload','".$_SESSION['brugerid']."')");
            $_SESSION['message'] .= $_FILES['file']['name'][$i]." uploaded.<br>";
          }
        }
      }
      if(!$uploads)  $_SESSION['message'] = "No files selected!";
    }

Selvfølgelig afhængig af, om brugerens id nu også ligger i $_SESSION['brugerid'].
Avatar billede nima Nybegynder
04. juli 2005 - 13:53 #5
Det lyder smart det med at oprette en mappe for hver bruger. Er det noget du også kan skrive koden til!?
Avatar billede jaw Nybegynder
04. juli 2005 - 13:57 #6
Det er godt nok utestet, men hvis du smider brugerens ID i $_SESSION['brugerid'], så tror jeg næsten nedenstående vil funke:

      $file_array = $HTTP_POST_FILES['file'];
      $_SESSION['message'] = "";
      $uploads = false;
      for($i = 0 ; $i < $files_to_upload; $i++)
      {
        if($_FILES['file']['name'][$i])
        {
          $uploads = true;
          if($_FILES['file']['name'][$i])
          {
        mkdir("/".$**UPLOADMAPPE**."/".$_SESSION['brugerid'], 0777);
            $file_to_upload = $**UPLOADMAPPE**."/".$_SESSION['brugerid']."/".$_FILES['file']['name'][$i];
            move_uploaded_file($_FILES['file']['tmp_name'][$i],$file_to_upload);
            chmod($file_to_upload,0777);
            $_SESSION['message'] .= $_FILES['file']['name'][$i]." uploaded.<br>";
          }
        }
      }
      if(!$uploads)  $_SESSION['message'] = "No files selected!";
    }
Avatar billede nima Nybegynder
04. juli 2005 - 14:04 #7
jamen, opretter den så ikke mappen hvergang? Skal den ikke have et tjek på om mappen allerede eksistere?

Jeg smider brugerens ID i $_SESSION['brugerid']
Avatar billede jaw Nybegynder
04. juli 2005 - 15:03 #8
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...
Avatar billede nima Nybegynder
04. juli 2005 - 15:14 #9
TIL JAW : Jeg tror jeg holder mig til dit andet forslag, fordi jeg skal have en admin bruger som skal have en oversigt over alle filer..

Men det virkede helt fint det med at indsætte stien i databasen.. Spørgsmålet er bare, hvordan får jeg de filer vist på min side??
Avatar billede nima Nybegynder
04. juli 2005 - 15:28 #10
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)
Avatar billede jaw Nybegynder
04. juli 2005 - 15:51 #11
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?
Avatar billede nima Nybegynder
04. juli 2005 - 16:01 #12
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 :

http://www.minhjemmeside.dk/uploadmappe

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..
Avatar billede jaw Nybegynder
04. juli 2005 - 16:04 #13
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']."'");
Avatar billede nima Nybegynder
04. juli 2005 - 16:14 #14
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 ??
Avatar billede jaw Nybegynder
04. juli 2005 - 16:17 #15
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);
Avatar billede nima Nybegynder
04. juli 2005 - 16:20 #16
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..

Ved du hvordan man kan se filstørrelsen på filen?
Avatar billede mewm Nybegynder
04. juli 2005 - 16:23 #17
filesize()
Avatar billede jaw Nybegynder
04. juli 2005 - 16:23 #18
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.

echo "Filen ".$filnavn." fylder ".filesize($filenavn)." bytes";
Avatar billede nima Nybegynder
04. juli 2005 - 16:26 #19
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!?
Avatar billede jaw Nybegynder
04. juli 2005 - 16:31 #20
Der vil du jo køre udtrækket:

$q = mysql_query("SELECT filnavn FROM tabel WHERE brugerid = ".$_SESSION['brugerid']);

while($row = mysql_fetch_array($q)) {
  echo "Navn: ".$row['filnavn']." størrelse: ".filesize($row['filnavn']);
}

Der skal du så enten inkludere hele stien i databasefeltet eller "manuelt".
Avatar billede nima Nybegynder
15. juli 2005 - 14:31 #21
til jaw > Tusind tak for hjælpen, du var til stor hjælp.
Undskyld det sene svar.
- Nima
Avatar billede nima Nybegynder
15. juli 2005 - 14:31 #22
Til Jaw > Husk lige at ligge et svar så du kan få nogle points :)
Avatar billede jaw Nybegynder
16. juli 2005 - 13:06 #23
Det vil jeg gøre - og selv tak... :)
Avatar billede nima Nybegynder
16. juli 2005 - 17:08 #24
til jaw.. Lige et sidste spørgsmål..

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&amp;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..
Avatar billede jaw Nybegynder
16. juli 2005 - 19:25 #25
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&amp;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...
Avatar billede nima Nybegynder
20. juli 2005 - 18:13 #26
Det virker helt perfekt. Tusind tak for hjælpen.
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