Ankündigung

Einklappen
Keine Ankündigung bisher.

Wichtige Dateien in Datenbank oder Filesystem?

Einklappen

Neue Werbung 2019

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

  • Wichtige Dateien in Datenbank oder Filesystem?

    Hallo,

    Szenario:
    Ein User will eine bestimmte Datei (bspw. MP3, PDF, RAR) von der Download-Plattform herunterladen.
    Er darf diese Datei aber nicht jederzeit durch Eingabe der absoluten URL erreichen.

    Wie lässt es sich realisieren, dass die zu schützenden Dateien wirklich nur dann ausgeliefert werden, wie vom Admin gewollt? Dabei sollen auch die Downloads gezählt werden.

    Wie sieht es mit der Performance aus, wenn mehrere MB große Dateien in eine Datenbank gespeichert und später ausgelesen werden sollen?
    Sollte man diese Dateien in einem Verzeichnis außerhalb des Webroots speichern und sie per PHP-Skript von dort abholen und dann ausliefern?

    Bin offen für Ideen.

    Vielen Dank.

  • #2
    Wie lässt es sich realisieren, dass die zu schützenden Dateien wirklich nur dann ausgeliefert werden, wie vom Admin gewollt? Dabei sollen auch die Downloads gezählt werden.
    - im Filesystem ablegen, dafür ist es da
    - in einem Ordner der via http nicht erreichbar ist (ausserhalb von Webroot oder .htaccess geschützt)
    - und über PHP ausliefern.

    Das Thema gabs schon oft (hier), such mal bisschen, wirst sicher fündig.
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Danke sehr.

      Ich überlege, eine Vorschaufunktion für Musikdateien einzubauen. Wie kann ich, ohne eine gekürzte Version der Audiodateien zu erstellen, diese Audiodatei außerhalb des Webroots an den MP3-Player ausliefern?

      Kommentar


      • #4
        Den Hinweis auf rechtliche Aspekte lasse ich weg.

        Du kannst dies mittels PHP machen, die Audiodatei auslesen und streamen. Für intensivere Nutzung gibt es da auch "bessere" Sprachen (beispielsweise C).
        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

        Kommentar


        • #5
          Keine Datenbank sondern Dateien ins Dateisystem. Mit den entsprechenden Möglichkeiten schützen und ausliefern wie schon unter Symlinks für Downloads, Zugriff von außen, Kontrolle über Downloads diskutiert wurde.

          Kommentar


          • #6
            Zitat von cy221 Beitrag anzeigen
            Danke sehr.

            Ich überlege, eine Vorschaufunktion für Musikdateien einzubauen. Wie kann ich, ohne eine gekürzte Version der Audiodateien zu erstellen, diese Audiodatei außerhalb des Webroots an den MP3-Player ausliefern?
            du kannst ein html5 audio tag erstellen dort als src eine php datei angeben, diese php datei liest mp3 datei und sendet mp3 headers
            apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

            Kommentar


            • #7
              Sobald die Mp3-Datei aber gestream wurde, liegt sie im Temp-Ordner, oder? Wer also bisschen Ahnung hat könnte sich die Datei denn auch so besorgen. Daher würde ich schon nur eine Vorschau zeigen. Könnte man mit PHP bestimmen, dass nur ein Teil der Datei gestreamt wird?

              Kommentar


              • #8
                Es liegt an dir, nur zu senden was du willst. Eine Audio- (und auch Video-Datei) ist im Prinzip nur ein Stream. Es macht (bleiben wir zu 100% theoretisch) absolut nichts, wenn du ab Byte n bis zu Byte m sendest (wobei n > 0; n < m).
                [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                Kommentar


                • #9
                  Ja, klar. Aber wie bekomme ich die benötigten Bytes aus der Datei. Schließlich muss der Header ja mitgenommen werden. Der wiederung könnte doch aber immer unterschiedlich groß sein und vielleicht sogar eine Prüfsumme enthalten (kenne mich nicht so gut da aus). Wenn ich nun nur einen Teil lade, ist die Datei denn nicht "kurrupt"?

                  Kommentar


                  • #10
                    Die Daten im MP3 sind in "Frames" unterteilt zu je 26ms Audio und jeder Frame enthält einen Kopf mit den relevanten Informationen. Im Prinzip kannst du irgendwo in der Datei einsteigen und anfangen, Daten auszuliefern. Der empfangende Player sollte Daten solange überlesen, bis er auf einen Frameheader trifft, ab dem er die Verarbeitung (aka Abspielen) beginnt.
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      Achso, dachte die Datei hat noch einen Header. Nicht nur die Frames. Danke für die Info!

                      Kommentar


                      • #12
                        http://de.wikipedia.org/wiki/MP3#Spezifikation hätte dir die Frage auch beantworten können. So etwas nennt sich "Eigeninitiative".
                        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                        Kommentar


                        • #13
                          Aus dem Wikipedia-Artikel geht, aus meiner Sicht, nicht hervor ob es neben den Frame-Headern noch einen Datei-Header gibt. Ein anderer Artikel brachte aber gewünschte Antwort:

                          Interessant ist auch die Einführung der Frameheaders. Da ein herkömmlicher Dateiheader, wie er bei anderen Dateiformaten durchaus üblich ist, bei MP3-Dateien nicht existiert, enthält jeder einzelne Frame einen eigenen Header.
                          Die Frage ist bei mir im übrigen nur aufgrund des Threads aufgekommen. Ich habe mich sonst nicht weiter damit jetzt beschäftig. Wäre ich TE hätte ich das natürlich gemacht.

                          Kommentar


                          • #14
                            Natürlich ist es eigentlich so, dass Dateien im Filesystem liegen [sollten], es gibt aber durchaus auch Anwendungsfälle, in denen das Ablegen von Files in der DB (aus praktischen Erwägungen heraus) Sinn macht.
                            Z.B. hast Du mit dem Ablegen der Files in der Datenbank die Möglichkeit, sehr einfach eine Versionierung einzuführen, oder aber auch das Ganze auf mehrere Maschinen zu verteilen, wo die Files automatisch hinrepliziert werden.
                            In Deinem Fall liest sich das jedoch nicht so, als ob das benötigt würde

                            Sonst:
                            Wie ^^^ bereits geschrieben: Files in ein nicht über Web erreichbares Verzeichnis legen und über PHP (oder welche Sprache auch immer...) ausliefern. In dem Script kannst dann auch gleich noch Deinen Downloadcounter unterbringen etc. etc.

                            > Ja, klar. Aber wie bekomme ich die benötigten Bytes aus der Datei.
                            -> Du möchtest Dir die Dokumentation von fseek anschauen

                            Kommentar


                            • #15
                              Zitat von GoodbyeKitty Beitrag anzeigen
                              [...]
                              Z.B. hast Du mit dem Ablegen der Files in der Datenbank die Möglichkeit, sehr einfach eine Versionierung einzuführen, oder aber auch das Ganze auf mehrere Maschinen zu verteilen, wo die Files automatisch hinrepliziert werden.
                              [...])
                              Ja, sicher. Ich kann auch ein git-Repo initialisieren für meine Filestores und somit Versionieren. Oder die Dateien aufsteigend benennen:
                              Code:
                              afile.jpg
                              afile.jpg.1
                              afile.jpg.2
                              afile.jpg.3
                              Da sind dir unbegrenzt Möglichkeiten gesetzt. Zudem habe ich Dank dem Filesystem die Möglichkeit, die Daten auszulagern und auf dem Server, auf dem ich sie benötige nur zu mounten. Das wird mit der DB ungemein schwieriger.
                              [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                              Kommentar

                              Lädt...
                              X