peter: Tiff öffnen/aufrufen und speichern

Hallo,

kann man mit PHP eine Tiff-Datei lokal speichern?

Hintergrund:
Habe hier im Netzwerk einen Server hängen, auf dem ein CGI läuft.
Kann von dort Tiff-Dateien per HTTP anfordern (über CGI).

Diese würde ich gerne per PHP öffnen (fopen()?) und lokal speichern.
Geht das irgendwie?

Mit Eingabe der Adresse im Browser funktionierts, da kommt das Tiff an und das Downloadfenster geht auf. Kann das dann lokal speichern. Möchte das halt automatisieren und mich nicht jedesmal durchs Download-Menue klicken.

Viele Grüße
Peter

  1. Diese würde ich gerne per PHP öffnen (fopen()?) und lokal speichern.
    Geht das irgendwie?

    Ja. Dafür gibt es viele Möglichkeiten.

      
    [link:http://php.net/manual/de/function.file-put-contents.php@title=file_put_contents]($ordner."/".$dateiname, [link:http://php.net/manual/de/function.file-get-contents.php@title=file_get_contents]("http://server/ordner/$dateiname"));  
    
    

    wäre eine davon, welche dem guten Prinzip "Einfach! Einfach! Einfach!" folgt.

    Um mehr zu schreiben braucht es mehr Informationen.

    Jörg Reinholz

    1. Hallo,

      [link:http://php.net/manual/de/function.file-put-contents.php@title=file_put_contents]($ordner."/".$dateiname, link:http://php.net/manual/de/function.file-get-contents.php@title=file_get_contents);

      
      >   
      > wäre eine davon, welche dem guten Prinzip "Einfach! Einfach! Einfach!" folgt.  
        
        
      Hab ich mir angeschaut, sieht eigentlich ganz gut aus.  
      Bin mit Dateien nicht so firm. Wird da dann die Datei 1:1 gespeichert mit Header und allem Drum und Dran was es sonst noch so geben könnte?  
        
      Was ist eigentlich der Content/Inhalt einer Datei?  
      Da ist der Header doch nicht dabei, oder?  
        
      Hintergrund ist, daß das ganze von einem Aufsichtsscanner kommt.  
      Da is n Rechner drin, auf dem ein Server läuft.  
      Über das CGI kann man per HTTP vom Browser aus den Scanner einstellen, steuern und aktuelle Einstellungen/Parameter abfragen.  
        
      Das krieg ich soweit erstmal alles hin.  
      Da kommen dann als Antwort text/plain-Dateien rüber.  
      Die krieg ich mit PHP geöffnet, ausgelesen und weiterverarbeitet wie ichs brauch.  
        
        
      Mit  
        
      http://Scannername/CGIordner/scan  
        
      bring ich den Scanner auch zum scannen, das Image liegt dann im Scanner auf der Festplatte.  
      Antwort auf obigen Request ist dann ne text/plain mit z.B.: Status:OK (wenn der Scan geklappt hat).  
        
        
        
      Dann muß ich das Bild noch mit  
        
      http://Scannername/CGIordner/image  
        
      abholen, da kommt dann das Tiff.  
        
      Und das will ich 1:1 mit allem Drum und Dran lokal speichern.  
        
        
        
      Habe jetzt auch noch  
      [stream_copy_to_stream](http://php.net/manual/de/function.stream-copy-to-stream.php) gefunden.  
      Vielleicht wär das ja was für mich?  
        
        
      Gruß  
      peter
      
      1. Hi,

        mal ne Frage zum Header.
        Muß ich den überhaupt berücksichtigen beim Speichern des Tiff?
        Is der nicht eigentlich nur für die HTTP-Verbindung relevant?

        Gruß
        Peter

      2. Tach!

        Bin mit Dateien nicht so firm. Wird da dann die Datei 1:1 gespeichert mit Header und allem Drum und Dran was es sonst noch so geben könnte?

        Der HTTP-Header ist nur "Verpackungsmaterial" für das HTTP. Er gehört nicht zu Dateien und wird auch nicht von den file_get_contents() geliefert.

        Und das will ich 1:1 mit allem Drum und Dran lokal speichern.

        Definiere "Drum und Dran"! Das Bild ist nur das Drin. Das bekommst du. Die Metadaten

        Habe jetzt auch noch stream_copy_to_stream gefunden. Vielleicht wär das ja was für mich?

        Für welchen Anwendungsfall? Was Jörg geantwortet hat, reicht um den Inhalt des Bildes als Datei abzulegen. Fehlerbehandlung ist keine dabei. Die kannst du ja noch mit einbauen. Wenn dich der HTTP-Header interessiert, dann schau im Handbuch unter file_get_contents() bei "See Also".

        dedlfix.

        1. Hallo,

          Hab's jetzt mit copy() ausprobiert.
          Funktioniert einwandfrei.

          Allerdings komm ich da nicht an die Metadaten/HTTP-Header ran.
          Wenn ich erst die Header-Daten abfagen will, um eine eventuelle Fehlerbehandlung durchzuführen, bleibt mir wohl nichts anderes übrig, als die Datei erst zu öffnen (mit fopen();)?

          gruß
          peter

          1. Hi,

            Hab's jetzt mit copy() ausprobiert.
            Funktioniert einwandfrei.
            Allerdings komm ich da nicht an die Metadaten/HTTP-Header ran.

            natürlich nicht, hier wird ja ein Dateizugriff vorgetäuscht. Da gibt's keine HTTP-Header.

            Und hier liegt auch genau eine Schwachstelle deines Ansatzes: Er setzt voraus, dass der File-Zugriff auf URLs erlaubt ist (allow_url_fopen in der php.ini). Solange du die Konfiguration von PHP selbst unter Kontrolle hast, mag das okay sein; manche Webhoster deaktivieren diese Funktion aber, so dass keine Zugriffe auf HTTP-Ressourcen mehr mit Datei-Funktionen möglich sind.

            Wenn ich erst die Header-Daten abfagen will, um eine eventuelle Fehlerbehandlung durchzuführen, bleibt mir wohl nichts anderes übrig, als die Datei erst zu öffnen (mit fopen();)?

            Genügt dir der Rückgabewert von copy() nicht als Aussage?

            Ciao,
             Martin

            --
            Mit einem freundlichen Wort und einer Waffe erreicht man mehr, als mit einem freundlichen Wort allein.
              (Al Capone, amerikanische Gangsterlegende)
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Hallo,

              Und hier liegt auch genau eine Schwachstelle deines Ansatzes: Er setzt voraus, dass der File-Zugriff auf URLs erlaubt ist (allow_url_fopen in der php.ini). Solange du die Konfiguration von PHP selbst unter Kontrolle hast, mag das okay sein; manche Webhoster deaktivieren diese Funktion aber, so dass keine Zugriffe auf HTTP-Ressourcen mehr mit Datei-Funktionen möglich sind.

              Da is nix mit Webhostern. Läuft bei mir lokal, zur Steuerung vom Scanner.

              Genügt dir der Rückgabewert von copy() nicht als Aussage?

              Das sagt mir halt nur, ob der Kopiervorgang geklappt hat (boolean).
              Hab mich nochmal näher mit der Sache befasst und bin auf folgendem Stand:

              Der Scanner schickt das Image per HTTP rüber.

              1. Fall: ein Fehler tritt auf (beim Scannen)
                 -Der HTTP-Header enthält als Content-Type: text/plain
                 -Der HTTP-Body enthält Text mit der Fehlermeldung (Error-Code)

              2.Fall: Alles OK
                 -Der HTTP-Header enthält den Image-Type: tiff oder jpeg
                 -Der HTTP-Body enthält das Image

              Wenn ich den HTTP-Header also auslese, könnte ich entscheiden, ob ich überhupt kopieren bzw. speichern will und falls ja, welche Dateinamenserweiterung ich anhänge.

              Bin halt grade dabei, das alles erstmal grundsätzlich auszutesten, obs überhaupt funktioniert mit der Ansteuerung des Scanners, dem Scannen, Empfangen und Speichern der Bilder.
              Funktioniert soweit, jetzt gehts ans verfeinern.

              gruß
              peter

              1. Tach!

                Der Scanner schickt das Image per HTTP rüber.

                1. Fall: ein Fehler tritt auf (beim Scannen)
                     -Der HTTP-Header enthält als Content-Type: text/plain
                     -Der HTTP-Body enthält Text mit der Fehlermeldung (Error-Code)

                Welchen Response-Code verwendet er dazu?

                Selbst wenn angefragte Dokumente nicht vorhanden sind, bekommt man ja bei HTTP ein Dokument zurück. Das aber mit einem 4xx/5xx-Code garniert. Es kann ja nicht Sinn eines Protokoll-Wrappers sein, in solch einem Fall dieses Fehlerdokument zurückzugeben. Dann müsste man ja eine Inhaltsprüfung vornehmen, um zu wissen, ob der Request im angestrebten Sinne geklappt hat oder nicht. Ich gehe davon aus, dass in einem Fehlerfall die "missbrauchten" Dateisystem-Funktionen wie bei einem Dateisystemfehler auch einen Fehler zurückmelden und nicht "alles ist gut, hier hast du dein (Fehler-)Dokument" antworten.

                dedlfix.

          2. Tach!

            Hab's jetzt mit copy() ausprobiert.
            Funktioniert einwandfrei.
            Allerdings komm ich da nicht an die Metadaten/HTTP-Header ran.

            Also doch nicht einwandfrei. Die Beschreibung zu file_get_contents() verwies auf $http_response_header. Ist das bei copy() nicht gefüllt? Und auch copy() kennt eine Möglichkeit, einen Stream-Context zu übergeben. Ist über diesen auch kein Rankommen an die Response-Header? (Ich hab das noch nicht gebraucht und weiß das nicht.)

            Wenn ich erst die Header-Daten abfagen will, um eine eventuelle Fehlerbehandlung durchzuführen, bleibt mir wohl nichts anderes übrig, als die Datei erst zu öffnen (mit fopen();)?

            fopen() verwendet einen Wrapper und gibt dir auch nur die Datei ohne HTTP-Header. Mit fsockopen() kommst du an die Header, musst aber HTTP komplett selbst sprechen.

            dedlfix.

            1. Hallo,

              Also doch nicht einwandfrei. Die Beschreibung zu file_get_contents() verwies auf $http_response_header.

              So wie ich das verstehe, ist $http_response_header derjenige von der aktuell geöffneten PHP-Datei.
              Ich bräuchte aber den von der Datei, die ich mir innerhalb dieser PHP-Datei von woanders hole.

              Das Kopieren der Datei funktioniert einwandfrei.

              gruß
              peter

              1. Tach!

                Die Beschreibung zu file_get_contents() verwies auf $http_response_header.
                So wie ich das verstehe, ist $http_response_header derjenige von der aktuell geöffneten PHP-Datei.

                Ich verstehe das anders. Die Header, die an den Client gesendet werden, aufgrund dessen Request das aktuelle Script läuft, bekommt man mit headers_list(). $http_response_header und get_headers() ist das was man bei selbst erzeugten Requests als Antwort von anderen Servern bekommt.

                dedlfix.