Ankündigung

Einklappen
Keine Ankündigung bisher.

Text beim Uploaden von Datein speichern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Text beim Uploaden von Datein speichern

    Ich wollte eine Website coden, auf der man Dateien hochladen und auch wieder herunterladen kann. Außerdem sollte neben jedem Download eine Beschreibung, die beim Erstellen festgelegt wird, stehen. Wie mache ich das mit der Beschreibung?
    Mein Code:
    HTML-Code:
    <!doctype html>
    <html>
    
    <head>
        <title>Downloads | Schillerschule </title>
        <meta charset=utf-8>
        <link rel="stylesheet" href="downloads.css" media="screen">
        <link rel="stylesheet" href="styles/portfolio.css" media="screen">
    </head>
    
    <body>
        <header>
          <div class="topnav">
            <a  href="#home">Home</a>
            <a class="active" href="Downloads.php">Downloads</a>
            <a href="#contact">Contact</a>
            <a href="#about">About</a>
            <div class="login"><a href="logout.php" >   Logout   </a></div>
          </div>
            <br>
            <br>
            <br>
                    <form method="POST" enctype="multipart/form-data" action="upload.php">
                <center><div class="file"><input type="file" name="file" id="file"> </div>
                 </center>
                <br>
                <center><div class="submit"><input type="submit" value="Hochladen" id="button"></div></center>
                <br>
                <br>
            </form>
        </header>
        <main>
            <br>
            <br>
            <?php
    $files = scandir("uploads");
    for($a = 2;$a < count($files); $a++){
        ?>
        <p><center>
        <a id="list" download="uploads/<?php echo $files[$a]?>" href="uploads/<?php echo $files[$a]?>"><?php echo $files[$a]?></a>
    
    </center> </p>
        <br>
        <br>
    
        <?php
    }
    ?>
            <br>
            <br>
        </main>
        <footer>
          <br>
          <br>
          <center><a href="">Impressum</a></center>
        </footer>
    </body>
    
    </html>

    und..



    PHP-Code:
    <?php

        $file 
    $_FILES["file"];
        
    $name $_POST['name'];



        
    move_uploaded_file($file["tmp_name"], "uploads/" $file["name"]);
        
    header("Location: Downloads.php");
    ?>

  • #2
    Moin, moin!

    ich habe zunächst mal deine Download.php etwas überarbeitet.
    Der Verarbeitungskram ist vor das Template gewandert. Man schreibt sowas einfach nicht mitten ins HTML rein.
    Einfach die ersten beiden Einträge von scandir() skippen ist auch nicht so der beste weg. Hier wurd das jetzt mal durch eine is_file() Prüfung ersetzt. Dadurch fliegen die "." und ".." Einträge raus und auch alles andere, was keine Datei ist, z.B. Unterordner oder Verweise.
    Dann habe ich noch htmlentities() bzw. urlencode() Aufrufe hinzugefügt. Sollte man immer verwenden, da du ja nicht weißt, was da wirklich kommt und dir ein doof benannter Dateiname am Ende vielleicht die Seite zerlegt oder der Link einfach nicht funktioniert.

    Schau es dir einfach mal als Hilfestellung an.

    Download.php (überarbeitet)
    PHP-Code:
    <?php
    $uploadDirectory 
    "uploads";
    $files = array();
    $fileEntries scandir($uploadDirectory);
    if (
    is_array($fileEntries)) {
        foreach (
    $fileEntries as $filename) {
            
    $filepath $uploadDirectory DIRECTORY_SEPARATOR $filename;
            if (
    is_file($filepath)) {
                
    $files[] = array(
                    
    'displayName' => $filename,
                    
    'downloadUri' => $uploadDirectory '/' urlencode($filename),
                );
            }
        }
    } else {
        
    // es ist ein Fehler aufgetreten, z.B. Verzeichnis exisitert nicht 
        // oder kann nciht gelesen werden
        // @TODO Fehlermeldung einbauen
    }
    ?>
    <!doctype html>
    <html>
        <head>
            <title>Downloads | Schillerschule </title>
            <meta charset="utf-8">
            <link rel="stylesheet" href="downloads.css" media="screen">
            <link rel="stylesheet" href="styles/portfolio.css" media="screen">
        </head>

        <body>
            <header>
                <div class="topnav">
                    <a  href="#home">Home</a>
                    <a class="active" href="Downloads.php">Downloads</a>
                    <a href="#contact">Contact</a>
                    <a href="#about">About</a>
                    <div class="login"><a href="logout.php" >   Logout   </a></div>
                </div>
                <br />
                <br />
                <br />
                <form method="POST" enctype="multipart/form-data" action="upload.php">
                    <center><div class="file"><input type="file" name="file" id="file"> </div>
                    </center>
                    <br />
                    <center>
                        <div class="submit">
                            <input type="submit" value="Hochladen" id="button">
                        </div>
                    </center>
                    <br />
                    <br />
                </form>
            </header>
            <main>
                <br />
                <br />
                <?php foreach ($files as $file): ?>
                    <p>
                        <center>
                            <a href="<?= $file['downloadUri'?>"
                               download="<?= htmlentities($file['displayName']) ?>">
                                <?= htmlentities($file['displayName']) ?>
                            </a>
                        </center> 
                    </p>
                    <br />
                    <br />
                <?php endforeach; ?>
            <br />
            <br />
        </main>
        <footer>
            <br />
            <br />
            <center><a href="">Impressum</a></center>
        </footer>
    </body>

    </html>

    Deine Frage nach dem Zusatztext für die kann nicht pauschal beantwortet werden.
    Auch an der Dateiablage muss ggf. noch geschraubt werden.

    Damit die Leute den Zusatztext eingeben können, musst du dem Formular einfach erstmal ein neues Formularfeld hinzufügen. Entweder ein Input oder eine Textarea, kommt drauf an, wie viel Txst da eingegeben werden soll.

    Hast du eine Datenbank zur Verfügung?
    Falls ja, dann, sollten die Informationen zu den Dateien (mindestens Originaldateiname und Beschreibung) in einer Tabelle gespeichert werden. Dort könnte man auch noch weiter Informationen ablegen wie Dateigröße, Uploaddatum, Ablageort auf dem Dateisystem und was man sonst noch für nützlich hält.
    Die Dateien auf der Festplatte können dann auch anders benannt abgelegt werden. Üblicherweise behilft man sich dann einer ID, die aus der Datenbanktabelle kommt. So vermeidet man auch Probleme, falls zwei Nutzer eine Date mit gleichem Namen hochladen oder wenn die Dateinamen Sonderzeichen enthalten.

    Falls keine Datenbank zur Verfügung steht, könnte man ein System mit "Metadateien" nutzen.
    D.h. zusätzlich zu jeder eingeladenen Datei wird eine zweite Datei erstellt. Dies ist ein Textdatei mit einer vorgegebenen Namensstruktur (Beispiel: <uploadfilename>.meta.text)
    In diese Datei kann man dann einfach die Zusatzinformationen schreiben. Falls mehrere Informationen gespeichert werden sollen, kann man die Informationen einfach in einem strukturiertem Array erfassen, mit json_encode() umwandeln und in der Datei speichern. Zum auslesen der Informationen dann einfach die Metadatei öffnen, einlesen mit json_decode() wieder in ein Array umwandeln.
    Derartige Ablagestrukturen verlangen aber u.U. sehr viele Festplattenzugriffe und sind langsam.
    Wenn es nur um wenige Dateien geht, kann man sowas aber mal machen.

    Wo wir dann bei der nächsten Frage wären: Was soll das System leisten können?
    Geht es um ein Dutzend oder 10 Millionen Dateien, die da abgelegt werden sollen?


    Dein Upload-Order sollte im Übrigen noch abgesichert werden, z.B. über ein .htaccess Datei.
    Oder die Dateien werden irgendwo abgelegt, wo man nciht direkt per Browser einfach rankommt und die Dateie werden dann über ein PHP Script indirekt ausgeliefert oder aber über ReWrite Rules des Webservers ...

    Naja, so gaaanz einfach ist deine Fragestellung nciht

    Ic hhoffe, ich hab dich jetzt nicht erschlagen

    Kommentar


    • #3
      HTML ist auch nicht in Ordnung.
      Element <center> ist schon seit Jahren veraltet, Vielleicht auch mal in CSS einlesen, das spart dann auch schon mal etliche <br>.
      Submit hat kein Name Attribut, wird somit auch nicht übertragen.

      Kommentar


      • #4
        Gnom42
        Ja, eine Datenbank habe ich zur Verfügung. Ich habe aber mit ihnen kaum Erfahrung und habe den Login gerade so mit viel Hilfe aus dem Internet hinbekommen. Ich wäre dir sehr dankbar wenn du mir bei soetwas helfen könntest.

        Zu deinen Fragen: Es wird nicht über 100 Dateien gehen. Was würdest du empfehlen? (Metadateien oder Datenbank)

        Das Formularfeld gibt es, ist aber ohne Zweck.

        Welches Format des Formular-Feldes empfiehlst du bei bis zu 75 Wörtern? (Input oder Textarea)

        Kann ich noch ein Feld hinzufügen, in dem der Name der Datei geändert werden kann. Bei mir fehlte dannach immer die Endung, was beim Anzeigen natürlich schön ist, aber beim Öffnen eher ein Problem.

        Dein Upload-Order sollte im Übrigen noch abgesichert werden, z.B. über ein .htaccess Datei.
        Oder die Dateien werden irgendwo abgelegt, wo man nciht direkt per Browser einfach rankommt und die Dateie werden dann über ein PHP Script indirekt ausgeliefert oder aber über ReWrite Rules des Webservers ...
        Wie würdest du das lösen?

        Da ich noch sehr in den Startlöchern stecke, wünsche ich noob-verständliche Antworten.

        Ich hoffe, ich habe dich auch nicht mit meinen Fragen erschlagen.

        Kommentar


        • #5
          Lerne Grundlagen.

          Kommentar


          • #6
            protestix Danke für deine grandiose Hilfe!

            Kommentar


            • #7
              quhxl Sich bei den Grundlagen einzulesen wird unabdingbar sein.
              Je nach dem wie dein Stand da ist, brauchst du auf jedenfall grundlegendes Wissen darüber, wie man mit einer Datenbank umgeht.
              (Die Metadateien Lösung würde ich nur machen, wenn es nicht anders geht, das ist immer ziemlich viel gefummel)

              Hast du bereits auf deiner Webseite eine Möglichkeit standardisiert an eine DB Verbindung (ich vermute mal MySQLi oder PDO) ranzukommen, oder wird das in jedem Script "per Hand" aufgebaut?

              Eine kleine Klasse oder Funktion zu schreiben die das übernimmt schadet da meist nicht. Kann man dann in jedem Script wiederverwenden
              Wo wir schon beim nächsten wären: werde dir klar darüber, ob es eine Objektorientierte Lösung oder eine Prozedurale Lösung werden soll.
              Das hängt auch davon ab, was sonst schon so im Einsatz ist auf der Seite. Man sollte da nicht immer wild mixen


              Zum Funktionalen Teil
              Überlege, welche Daten du alles brauchst und erstelle eine entsprechende Datenbanktabelle mit den richtigen Datentypen dazu.

              Zum Beispiel
              id integer PRIMARY INDEX, AUTOINCREMENT
              filename varchar(255) Original Dateiname der Datei
              path varchar(?) / text Ablageort der Datei auf dem Server Dateisystem. Die Länge des Datenbankfeldes muss ausreichend sein. Überlege hier wie lang die Namen werden können und wähle einen entsprechenden Datentyp
              description text Beschreibungstext
              filesize integer Dateigröße in bytes
              mime varchar(255) mime-type der Datei
              uploadtime datetime
              Naja, mach dir mal Gedanken dazu. Vielleicht willst du ja auch noch Nutzerinformationen ablegen, also wer die Datei gespeichert hat usw. Du erwähntest ja, dass es einen Loginbereich gibt.


              Dann solltest du dir Überlegen welche Funktionalitäten du benötigst.
              1. eine neue Datei einladen und einen entsprechenden Datensatz in der Datenbank speichern
              2. alle vorhandenen Dateien auslesen
              3. eine Datei aus der Datenbank (und vom Dateisystem) löschen
              4. einen Datei-Datensatz aus der Datenbank auslesen
              Für jeden Anwendungsfall müssen dann Funktionen definiert werden (oder Methoden in einer Klasse bei OOP Ansatz)

              Überlege dir, welche Informationen dann für jeden einzelnen Anwendungsfall benötigt werden...

              Hier mal ein Vorschlag
              PHP-Code:
              /**
               * Liest vorhandene Dateien aus und liefert eine entsprechende Repräsentation
               * der Daten zurück
               * @return Array mit Datenstruktur für Dateiinformationen
               */
              function getAllFiles() {}

              /**
               * liest einen bestimmten Dateidatensatz aus der Datenbank  
               * @param int $id Id des Datensatzes
               * @return Datenstruktur für Dateiinformationen
               */
              function getFile($id) {}

              /**
               * Speichert einen Dateidatensatz und legt die Datei entsprechend ab.
               * @param string $path Ablageort der hinzuzufügenden Datei
               * @param string $originalFilename Originaldateiname der Datei
               * @param string $description Beschreibungstext
               * @return int Id des neuen Datensatzes
               */
              function saveNewFile($path$originalFilename$description) {}

              /**
               * Löscht einen Datei Datensatz und entfernt die zugehörige Datei vom
               * Dateisystem
               * @param int $id
               * @return bool true, wenn Löschen erfolgreich
               */
              function deleteFile($id){} 
              ... erst anschließend geht es an die entsprechende Implementierung.

              Die "Datenstruktur für Dateiinformation" sollte auch noch festgelegt werden.
              Einfachheitshalber könnte man das mit einem Array machen, aber ein Objekt als Datenmodell bietet mehr Möglichkeiten, ist aber etwas aufwendiger.



              Spezifiere also erstmal für die selbst deinen Anwendungsfall!
              Wenn du das gemacht hast, dann ergeben sich solche Dinge wie die Art des Eingabefeldes für die Beschreibung auch quasi von selbst, denn das ist dann die leichteste Übung dabei

              Schau doch zum Beispiel mal nach was so Unterschiede bei Input[type=text] und textarea sind ...
              • einzeilig?
              • mehrzeilig?
              • Maximallänge?
              • u.U. Frontend-Validierungsmöglichkeiten?
              • ...
              und dann entscheide für dich selbst, was deinen Anforderungen entspricht.



              FÜr ein System mit Uploadmöglcihkeit und Speicherung von Zusatzdaten wirst du keine Pauschalantwort bekommen, weil es meistens auf den konkreten Anwendungsfall ankommt.

              Kommentar


              • #8
                Kannst du mir etwas empfehlen mit dem ich die Grundlagen gut lernen kann?

                Kommentar


                • #9
                  Siehe Link aus Beitrag #5.
                  Da stehen weiter unten Empfehlungen.

                  Kommentar


                  • #10
                    Der Link führt ins Nirgendwo, protestix

                    Kommentar


                    • #11
                      Danke jonas3344
                      Habe ich soeben korrigiert.

                      Kommentar

                      Lädt...
                      X