Ankündigung

Einklappen
Keine Ankündigung bisher.

Guzzle Exception Behandlung bei File Download über Get wenn File nicht existiert

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

  • Guzzle Exception Behandlung bei File Download über Get wenn File nicht existiert

    Hallo Zusammen,

    wenn die Datei vorhanden ist, wird sie auch erzeugt, funktioniert einwandfrei. Wenn die Datei nicht vorhanden ist, sendet der Server kein Stream sondern ein 404 mit einen ErrorString.
    Genau das ist das Problem. Die Option "seve_to" oder "sink" erwarten einen gültigen Stream. Ich bekomme eine RuntimeException von /guzzlephp/psr7/Stream.php und keinen http errorcode.
    Hat jemand eine Idee wie man die Exception richtig abfängt? Oder gibt es eine andere Methode über Guzzle einen File download durchzuführen?


    PHP-Code:
                $myFile fopen($sourcefile'w');
                
    $stream GuzzleHttp\Psr7\stream_for($myFile);

                try{
                    
    $response $this->client->get($url, array('headers' => $header,
                        
    'save_to' => $stream));

                }
                catch (
    Exception $e)
                {
                    
    $response $this->StatusHandling($e);

                    return 
    $response;

                }
                
    fclose($myFile); 


  • #2
    Also laut Doku:
    A GuzzleHttp\Exception\ClientException is thrown for 400 level errors if the http_errors request option is set to true.
    http://docs.guzzlephp.org/en/stable/...tml#exceptions

    Kommentar


    • #3
      Es kommt jedoch keine "RequestException" sondern eine RuntimeException.

      Er kommt in den catch Block aber beim Versuch getRequest() abzurufen steigt er aus wegen der vorherigen RuntimeException
      Somit ist auch das nicht mehr möglich:
      PHP-Code:
          catch (ClientException $e)
        {     echo 
      Psr7\str($e->getRequest());    
              echo 
      Psr7\str($e->getResponse()); } 

      Kommentar


      • #4
        Was heißt "vorherige RuntimeException"? Entweder es wird eine ClientException geworfen oder eine RuntimeException. Und bei einer RuntimeException geht er nicht in diesen Catch-Block rein.

        Kommentar


        • #5
          Sorry, war nicht eindeutig erklärt.

          Wenn ich debugge in PHPStorm und stehe auf get und klicke auf F7(nächster Schritt) komme ich in den Catch Block in PHPStorm frage ich die Variable $e ab und sehe eine "RuntimeException" ich klicke wieder auf F7
          PHP-Code:
          echo Psr7\str($e->getRequest()); 
          wird ausgeführt und kommt in TaskQueue.php __constructor und führt register_shutdown_function aus. Ich habe also keine Möglichkeit den http status abzufragen.

          Kommentar


          • #6
            Nein, das ist unmöglich. Wenn du im Catch gezielt ClientExceptions abfängst, kann da niemals eine RuntimeException in der Variable stecken. Außer dein PHP ist kaputt, was aber recht unwahrscheinlich ist.

            Kommentar


            • #7
              Möglicherweise interpretiere ich etwas falsch. Schaut dir bitte mal den screen shot an.

              Wahrscheinlich hat es nichts damit zu tun, aber ich habe dieses kleine Projekt verschoben. Seit dem funktioniert alles alles nur wenn ich irgend eine HTML Seite öffne über den Build In WebServer wird am Ende der URL ein ID von PHPStorm angehängt.

              http://localhost:63342/Newsletter/pu...fs2oqjd69raebf

              Den Parameter "?_ijt=9r7m5fvokttefs2oqjd69raebf" habe ich nicht zumindest nicht bewusst angegeben.

              Angehängte Dateien

              Kommentar


              • #8
                catch (\GuzzleHttp\Exception\ClientException $e) gehört da hin.

                Kommentar


                • #9
                  Zitat von hellbringer Beitrag anzeigen
                  catch (\GuzzleHttp\Exception\ClientException $e) gehört da hin.
                  dann kommt er nicht in den Catch Block rein auch nicht bei catch (\GuzzleHttp\Exception $e)

                  Kommentar


                  • #10
                    Zitat von R1100 Beitrag anzeigen
                    dann kommt er nicht in den Catch Block rein auch nicht bei catch (\GuzzleHttp\Exception $e)
                    Soll er auch nicht, wenn es keine ClientException gibt. Denn ohne ClientException gibts auch kein getRequest() und getResponse().

                    Was mir auffällt, warum verwendest du überhaupt fopen()? In der Doku von Guzzle wird einfach ein Dateipfad als Parameter angegeben.

                    Und warum heißt die Variable $sourceFile, wenn es doch offensichtlich ein Target und keine Source ist?

                    Kommentar


                    • #11
                      Zitat von hellbringer Beitrag anzeigen

                      ..
                      Was mir auffällt, warum verwendest du überhaupt fopen()? In der Doku von Guzzle wird einfach ein Dateipfad als Parameter angegeben.
                      ..
                      Das war der richtige Hinweis. ich habe es ohne fopen() gemacht und schon kommt eine GuzzleHttp\Exception\ClientException jetzt kann ich auch den Statuscode 404 abfangen! Perfekt. Dankeschön dafür.

                      Eine Kleinigkeit habe ich noch in diesem Zusammenhang: Wenn die Datei vorhanden ist, wird sie auch angelegt aber nicht gleich freigegeben. Nach dem Download muss die Datei umbenannt werden. Da der Dateiname im Header mit übertragen wird. Zuvor wurde ein Eindeutiger Name der Datei generiert über uniqid() Hast du eine Idee wie ich die Datei freigeben kann? /fclose($sourcefile); funktioniert natürlich nicht.

                      So sieht jetzt meine umgebaute Methode aus.

                      PHP-Code:
                          public function BildDownload($BildID$breite$hoehe)    {
                              try {
                                  
                      $url $this->API_URL "/getBildDownload/" $BildID "/" $breite "/" .  $hoehe;

                                  
                      //Header für images anwenden
                                  
                      $header $this->GetImageHeader();

                                  
                      //temp file für den Download
                                  
                      $sourcefile =  join(DIRECTORY_SEPARATOR, array($this->imagePathuniqid() . ".png"));

                                      
                      $response $this->client->get($url, array('headers' => $header,
                                          
                      'sink' => $sourcefile));

                                  
                      //Aus dem Header den Filename abfragen
                                  
                      $disp $response->getHeader('Content-Disposition');

                                  
                      $filename substr($disp[0],22,strlen($disp[0])-22-1);
                                  
                      $targetfile =  join(DIRECTORY_SEPARATOR, array($this->imagePath$filename));

                                  
                      //temp file umbenennen
                                  
                      if (file_exists($sourcefile)) {
                                      
                      rename($sourcefile$targetfile); //<<<<<< Datei ist nicht frei und kann nicht umbenannt werden!
                                      
                      return json_encode(array("image"=>$targetfile));
                                  }

                              }
                              catch (
                      GuzzleHttp\Exception\ClientException $e)
                              {
                                  
                      $response $this->StatusCodeHandling($e);

                                  return 
                      $response;
                              }
                          } 

                      Kommentar


                      • #12
                        Hallo hellbringer,

                        ich habe das Problem mit der Datei freigeben nach dem Download vom letzten posting nicht lösen können. Hast du mir noch einen Hinweis?
                        Die Datei wird heruntergeladen jedoch nicht freigegeben so dass ich sie umbenennen kann.
                        Vielleicht kannst du mal drüber schauen wenn es deine Zeit erlaubt.

                        Kommentar

                        Lädt...
                        X