Ankündigung

Einklappen
Keine Ankündigung bisher.

readfile ersatz

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • readfile ersatz

    Hallo,

    ich hab ein Script über das ich Datein zum Download anbeite.
    Dabei sollen nur Registrierte User die Datei downloaden können.

    zur Zeit realisiere ich das ganze über:

    PHP-Code:
    header(".. Daten für den hrader der Datei");
    readfile("pfad zur Datei"); 
    Das Ganze klappt bei kleineren Datein auch sehr sauber und gut.

    Jetzt habe ich aber auch größere Datein. Bei denen geht es nicht mehr so einfach. Entweder bricht das Script ab oder der Server-Ram ist überlaster oder irgend was anderes..

    FRAGE:

    Gibt es im PHP eine andere Möglichkeit eines "verstecken" Downloads außer über readfile?


  • #2
    [MAN]fopen[/MAN], [MAN]fread[/MAN], [MAN]fclose[/MAN]
    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

    Kommentar


    • #3
      damit offne ich doch nur datein für ein script!
      ich will die aber in den ausgabepuffer schreiben so das man die downloaden kann, ohne den entsprechenden originalpfad zur datei zu kennen..

      Kommentar


      • #4
        Zitat von jens76 Beitrag anzeigen
        ich will die aber in den ausgabepuffer schreiben ...
        Ach ja, hatte ich vergessen: [MAN]fopen[/MAN], [MAN]fread[/MAN], [MAN]print[/MAN], [MAN]fclose[/MAN]. Sorry.
        Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

        Kommentar


        • #5
          Warum sollte das besser sein als readfile() ? Wenn das Skript bei großen Dateien abbricht, versuch doch mal folgendes an den Anfang zu setzen:

          PHP-Code:
          set_time_limit(0); 
          @fschmengler - @fschmengler - @schmengler
          PHP Blog - Magento Entwicklung - CSS Ribbon Generator

          Kommentar


          • #6
            ich habe das hier in einem Script und damit auch bei großen Dateien noch nie ein Problem gehabt:
            PHP-Code:
                header('Content-Description: File Transfer');
                
            header("Content-Type: text/x-csv"); 
                
            header('Expires: 0');
                
            header("Content-Disposition: attachment; filename=datei.csv"); 
                
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                
            header('Pragma: public');
                
            header('Content-Length: ' filesize($filename));
                
            readfile($filename); 
            (wobei ich nicht ganz sicher bin, wie groß die größte Datei jemals war. Es geht hier um Downloads von Mysql-Selektionen.

            Grade den Post von fab gesehen.
            set_time_limit(0);
            habe ich auch im Script.
            PHP-Code:
            if ($var != 0) {
              
            $var 0;

            Kommentar


            • #7
              Ist ja nicht so, als ob sich nicht auch schon andere Leute Gedanken dazu gemacht hätten - die stehen bspw. in den Nutzerkommentaren zu readfile im Manual, und da könnte man ja auch mal reinschauen, bevor man fragt ...

              Kommentar


              • #8
                Zitat von fab Beitrag anzeigen
                Warum sollte das besser sein als readfile() ?
                Weil man dann steuern kann, wieviel der Datei in den Hauptspeicher geladen wird.
                Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

                Kommentar


                • #9
                  also über fopen usw... ist noch größerer müll!
                  da nutz man ja nichtmal den ausgabepuffer sondern direkt den php puffer.

                  das problem ist halt es kommt bei größeren datenmengen zu einem speicherüberlauf und einem abbruch...

                  liegt vielleicht am server selber? ist nur ein kleiner vserver..

                  Kommentar


                  • #10
                    Zitat von jens76 Beitrag anzeigen
                    da nutz man ja nichtmal den ausgabepuffer sondern direkt den php puffer.
                    [MAN]while[/MAN], [MAN]feof[/MAN], [MAN]flush[/MAN].
                    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

                    Kommentar


                    • #11
                      zu gut deutsch... das ganze läuft erstmal in den speicher von php!
                      und mit print kannste das erst recht vergessen!

                      Kommentar


                      • #12
                        Top Antwort "mimomamu"

                        ich will dich ja nicht angreifen, aber hast du viellicht mal gelernt in ganzen sätzen zu schreiben?

                        außerdem ist die antwort genauso vie deine vorherigen kommentare...

                        die ließt es auch erstmal in den php internen speicher ein, schiebt es dann in den ausgabespeicher ...

                        also wieder doppelte speicherbelastung!

                        und wenn schon der Ausgabespeicher nicht reicht.... gehen deine wort- bzw. bheflsgruppen erst recht zu lasten des systems!

                        Kommentar


                        • #13
                          Zitat von jens76 Beitrag anzeigen
                          die ließt es auch erstmal in den php internen speicher ein, schiebt es dann in den ausgabespeicher ...
                          Seltsam, ich kann trotz Speicherbegrenzung auf 128 MB mit
                          PHP-Code:
                          $file fopen($filename'r');
                          if (
                          $file) {
                                  
                          header ('Content-Type: binary/octet-stream');
                                  
                          header ('Content-Length: ' filesize($filename));
                                  while (!
                          feof($file)) {
                                          print(
                          fread($file4096));
                                          
                          flush();
                                  }
                                  
                          fclose($file);

                          Dateien herunterladen, die mehrere Gigabyte groß sind.
                          Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

                          Kommentar


                          • #14
                            Zitat von jens76 Beitrag anzeigen
                            ich will dich ja nicht angreifen, aber [...]
                            Ich dich auch nicht - aber vielleicht informierst du dich erst mal, bevor du hier an kurzen, aber sachlichen und vollkommen zutreffenden Antworten herummäkelst.

                            die ließt es auch erstmal in den php internen speicher ein, schiebt es dann in den ausgabespeicher ...

                            also wieder doppelte speicherbelastung!
                            Informiere dich bitte, was flush bewirkt.

                            und wenn schon der Ausgabespeicher nicht reicht.... gehen deine wort- bzw. bheflsgruppen erst recht zu lasten des systems!
                            Quatsch - du hast offenbar noch gar nicht verstanden, was das bewirkt.
                            Also informiere dich, und äußere dich bitte erst danach wieder - Danke.

                            Kommentar


                            • #15
                              ich hab mal eine Frage , die ins gleiche Themengebiet fällt ...

                              ich hab beide Lösungen ausprobiert ... readfile und print(fread) ..

                              firefox .. alles wunderbar .. Meldet, dass Excel Daten Komma separiert kommen - und bietet mir an, die Datei zu speichern oder auch direkt in Excel zu öffnen ...

                              aber der liebe IE 6 (nicht meckern - ich muss ihn leider unterstützen, Konzern-Zwang) ... der berechnet brav die CSV-Datei (berechnet = erzeugt sie aus der Datenbank) - aber wenn es an den Upload zum User geht .. tot , aus ..

                              Fehlermeldung : "?csvexp kann nicht gelesen werden" <-- dies hängt der Link an meine Adresszeile an, um zur CSV-Export-Funktion zu verzweigen, dass es funktioniert seh ich ja daran, dass die Datei erzeugt wird (mit Datum im Dateinamen und richtiger Erstellungszeit) ...

                              Also woran kann der Upload zum IE scheitern?

                              mein Code
                              PHP-Code:
                              ... // erzeugen der CSV Daten
                              fclose($handle);
                              $Dateiname basename($Datei);
                              $Groesse filesize($Datei);
                              $file=fopen($Datei,'r');
                              set_time_limit(0);
                              if (
                              $file) {
                                 
                              header('Content-Type: binary/octet-stream');
                                 
                              header("Content-Disposition: attachment; filename=".$Dateiname );
                                 
                              header('Content-Length: '.$Groesse );
                                 while (!
                              feof($file)) {
                                    print(
                              fread($file,4096));
                                    
                              flush();
                                 }
                              }
                              fclose($file);
                              die(); 
                              // damit der verstellte Header nicht übernommen wird 
                              "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

                              Kommentar

                              Lädt...
                              X