mit fopen datei aus dem internet öffnen und dann POINTER SETZEN?!

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

  • mit fopen datei aus dem internet öffnen und dann POINTER SETZEN?!

    hi alle!
    ich muss aus einer datei, die nicht auf meinem server liegt, ab position x lesen ohne vorher die ganze datei auf den server zu übertragen, weil die zu groß ist.
    ich habe ein script, dass so aussieht:
    PHP-Code:
    $datei fopen('http://test.de/test.rar',"r");
    fseek($datei100);
    echo 
    fread($datei10000);
    fclose($datei); 
    als fehler bekomm ich:
    Warning: fseek(): stream does not support seeking in [...]
    Wie kann ich OHNE immer die GANZE datei zu übertragen, den pointer setzen?!!

    danke jungs&mädels!!

    mfg
    tim

  • #2
    Hallo,

    hab zwar dass jetzt ned nachgelesen, aber ich denke dass du die Datei von nem Webserver nur im ganzen Stück bekommst.

    Mal andersrum:
    Warum ist dir die Datei zu groß? Dauert die Übertragung zu lange? Dann müsst die Datei aber echt riesig sein, weil die Server in der Regel mit dicken Standleitungen am Netz hängen (außer dein Kumpel hostet dich auf seinem PC mit ner DSL-Flat ). Da sind ein paar MB in der Zeit eines Wimpernschlags übertragen. Oder gehts dir um den Traffic?

    Gruss
    Quetschi

    EDIT:
    Evtl. gehts doch, der Internet-Explorer kann ja abgebrochene Downloads auch wieder an der richtigen Stelle fortsetzen, aber wie erklärt man dem Webserver ab welcher Stelle man die Datei haben möchte
    Zuletzt geändert von Quetschi; 07.07.2005, 22:55.
    Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
    Schön - etwas Geschichte kann ja nicht schaden.
    Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

    Kommentar


    • #3
      Der IE und jeder andere Resume-fähige Downloader holt sich die Größe des bereits runtergeladenen Dateistücks als <offset> und sendet ein "REST <offset>" an den FTP-Server. Der antwortet mit "Restarting from byte <offset>..". Daran erkennt man, dass der Server Resume unterstützt. Nun sendet man ein "RETRIEVE <filename>" oder "RETR <filename>" und bekommt als erstes Byte <offset>+1. Dieses Byte und alle folgenden werden dann einfach an das erste Dateistück angehangen.

      HTTP kennt nur GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, und CONNECT. Damit kann man kein REST nachahmen.

      Soviel zur Theorie. Du kannst also nur Dateiteile runterladen, wenn die Datei über FTP erreichbar ist. Dann wiederum ist es sehr einfach.

      Kommentar


      • #4
        mir fällt grad ein, dass man bei http aber headers mitschicken kann, die nur die gewünuschten bytes zurückgeben!

        ich glaube, die heißen content-range-start und content-range-end. da kann man in bytes angeben, von wo bis wo man die datei habe will, könnt es damit gehen?

        wie schickt man unter php einen http-request mit headers?

        danke!

        Kommentar


        • #5
          Du meinst http://www.w3.org/Protocols/rfc2616/....html#sec3.12?
          Kenne keinen Webserver der das kann, würde aber gern dazulernen.

          Kommentar


          • #6
            Original geschrieben von Prinz_Inside
            wie schickt man unter php einen http-request mit headers?
            analog zu http://www.php-faq.de/q/q-code-post.html
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              super danke!
              werds mal ausprobiern!

              ist echt ein top board hier!

              vieelen dank!

              ich meld mich wieder!

              Kommentar


              • #8
                hey geil es hat geklappt!!

                jetzt nur noch ein problem:

                so jetz steht oben wenn ich was empfange immer etwa sowas dabei (halt die antwort-headers):
                HTTP/1.1 206 Partial Content Date: Sun, 10 Jul 2005 00:14:52 GMT Server: Apache/1.3.31 (Unix) Last-Modified: Wed, 06 Jul 2005 14:17:38 GMT ETag: "bd4d6-11874e0-42cbe802" [...]
                wie kann ich die nicht angezeigt bekommen, gibts da irgendn nen header, etwa "Requst: SendNoAnswer" oder so, oder muss ich mittel strpos das ende davon ermitteln und dann da abschneiden?

                danke!!

                Kommentar


                • #9
                  Der HTTP-Header endet mit einem doppelten Zeilenvorschub+Zeilenumbruch (<CR><LF>, bzw. \r\n). Der erste ist das Ende der letzten Headerzeile, der zweite ist eine Leerzeile, die der eigentliche Trenner zwischen Header und Content ist.

                  PHP-Code:
                  $file substr($filestrpos("\r\n\r\n")); 
                  sollte den Header entfernen. (ungetestet)
                  Zuletzt geändert von onemorenerd; 10.07.2005, 13:20.

                  Kommentar


                  • #10
                    wenn überhaupt müsste es so gehn oder?
                    PHP-Code:
                    $file substr($filestrpos("\r\n\r\n")+strlen("\r\n\r\n")); 
                    ebenfalls ungetestet, werd ausprobiern.

                    mh ich hab jetzt ein anderes problem, und zwar ist folgendes möglich:
                    user ruft script auf webserver1 auf:
                    webserver1 schickt einen request an webserver2 (er requestet ein paar bytes von einer datei auf webserver2) und webserver2 schickt die requesteten bytes DIREKT an den user statt an webserver1 zurück

                    kann man da irgendwas mit den headern machen zB mit "Host" ?
                    also praktisch den Absender des Requests "fälschen" (hat so nen negativen touch^^)

                    bin um jede hilfe dankbar, insbesondere, wenn das möglich ist, was ich da bräuchte.

                    vielen dank!!
                    timmy

                    Kommentar


                    • #11
                      Das geht nicht ganz on the fly, denn dazu müßte es möglich sein, dass ein Webserver von sich aus etwas an den User schickt. Im RFC zu HTTP steht zwar imho was von PUSH, aber niemand weiß, was die Schreiber sich dabei gedacht haben.

                      Ich würde es mal so versuchen:
                      User schickt Request an Webserver1.
                      Webserver1 sendet Request an Webserver2.
                      Webserver2 legt die gewünschten Byte in einer separaten Datei ab.
                      Webserver1 leitet User per Header auf Webserver2.
                      User bekommt die eben angelegte Datei von Webserver2 geschickt.
                      Webserver2 löscht die Datei.

                      Kommentar


                      • #12
                        also erstmal danke!

                        zu PUSH hab ich leider nix gefunden..

                        wenn es garnet anders gehen würd, müst ichs wohl somachen, aber on-the-fly wie du so schön gesagt hast, wär wesentlich besser!!

                        wär toll, wenn sich noch jemand meldet!

                        tim

                        Kommentar


                        • #13
                          Ach vergiß das mit PUSH. Es gibt zwar PUT, aber das macht etwas völlig anderes. Ich weiß auch nicht, was mich da geritten hat.

                          Den direkten Weg, den du gern hättest, den kann es gar nicht geben.
                          Stell dir vor, du gehst mit deinem Browser auf Webserver1. Nachdem dein Rechner die IP von Webserver1 ermittelt und mit ihm eine TCP-Verbindung aufgebaut hat, sendet er ihm den Request. Über die gleiche Verbindung sendet Webserver1 im Normalfall die Antwort (HTTP-Header und Seite).

                          Nun soll aber die Antwort von Webserver2 kommen. Der weiß doch aber gar nichts von der bestehenden Verbindung. Er kennt nicht den Port auf deinem Rechner, die Maximum Segment Size und die Sequence Number. Webserver2 kann also die bestehende TCP-Verbindung nicht nutzen (ist klar, TCP ist schließlich Peer to Peer). Was ihm jetzt noch übrig bleibt, wäre eine neue Verbindung zu deinem Rechner aufzumachen. Wenn Browser so gebaut wären, dass sie wie Webserver auf einem bestimmten Port lauschen würden, wäre das kein Problem.

                          Aber kein Browser der Welt ist so gebaut, sonst könnte man ja jeden Surfer mit Werbeseiten zumüllen.

                          Fazit: TCP ist verbindungsorientiert, kann also nur per Umleitung gehen.
                          Lass Webserver1 solche Header senden, dass der User auf Webserver2 weitergeleitet wird und dort direkt auf ein Script, das anhand der GET-Parameter gleich die gewünschten Byte der gewünschten Datei zurückgibt.

                          Kommentar


                          • #14
                            mh danke!

                            ich kann aber auf webserver2 keine scripts oä installieren..

                            gibt es nich noch ne andere möglichkeit headers mit php zu senden?

                            es gibt doch header();

                            ich hab zwar immernur header('location:yx'); benutzt aber damit kann man doch bestimmt headers senden, ohne eine verbindung mit fsockopen herzustellen, oder?


                            vielen dank schon mal!

                            Kommentar

                            Lädt...
                            X