curl schreibt das Bild nicht in den Header

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

  • curl schreibt das Bild nicht in den Header

    Hallo,
    ich versuche mit cURL einen automatischen upload auf einen Pic-Hoster zu realisieren.
    Hier ist mein Code:
    PHP-Code:
    function uploadToForm($filePath$targetUrl, array $post)
    {
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_HEADERtrue);
        
    curl_setopt($chCURLOPT_VERBOSE1);
        
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
        
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/4.0 (compatible;)");
        
    curl_setopt($chCURLOPT_URL$targetUrl);
        
    curl_setopt($chCURLOPT_POSTtrue);
        
    curl_setopt($chCURLOPT_HTTPHEADER, array( 'Expect:' ) );
        
    curl_setopt($chCURLOPT_POSTFIELDS$post); 
        
    $response curl_exec($ch);
        
        return 
    $response;

    Hier der Aufruf:
    PHP-Code:
    include "../function.inc.php";
        
    $post = array(
            
    "userfile1"=>"@/root/123di_perspec_wide_far.jpg",
            
    "upload"=>"Upload"
            
    );

    echo 
    uploadToForm('/root/123di_perspec_wide_far.jpg'"http://******/basic.php"$post); 
    Ich kriege folgendes von cURL zurück:
    Code:
    * About to connect() to ***** port 80 (#0)
    *   Trying *********... * connected
    * Connected to ****** (******) port 80 (#0)
    > POST /basic.php HTTP/1.1
    User-Agent: Mozilla/4.0 (compatible;)
    Host: ******
    Accept: */*
    Content-Length: 18443
    Content-Type: multipart/form-data; boundary=----------------------------d35da9f09aab
    
    < HTTP/1.1 200 OK
    < Date: Wed, 24 Nov 2010 16:43:46 GMT
    < Server: Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9
    < X-Powered-By: PHP/5.2.9
    < Content-Length: 531
    < Content-Type: text/html
    < 
    * Connection #0 to host ****** left intact
    * Closing connection #0
    cURL getinfo:
    Code:
    Array
    (
        [url] => http://******/basic.php
        [content_type] => text/html
        [http_code] => 200
        [header_size] => 204
        [request_size] => 210
        [filetime] => -1
        [ssl_verify_result] => 0
        [redirect_count] => 0
        [total_time] => 2.27469
        [namelookup_time] => 0.342566
        [connect_time] => 0.501589
        [pretransfer_time] => 0.501601
        [size_upload] => 18443
        [size_download] => 531
        [speed_download] => 233
        [speed_upload] => 8107
        [download_content_length] => 531
        [upload_content_length] => 18443
        [starttransfer_time] => 0.501762
        [redirect_time] => 0
    )
    curl_error ist leer.

    Die Frage ist nun: Was mache ich falsch? Wieso wird das Bild nicht binär mit geschickt? Wieso wird der Boundary nicht geschlossen?

    MfG
    karoo

    PS:
    Ich habe den imagehoster mal entfernt, weil ich kein ärger bekommen will, dass ich ein upload-Skript dafür veröffentlicht habe.
    Die Post-Daten stimmen allerdings.

  • #2
    Hallo,

    das hat zwar vermutlich nichts mit dem Problem zu tun, aber der Parameter $filePath wird nie benutzt und in $post hat der Dateipfad ein @ davor.

    Was durchaus mit dem Problem zu tun haben könnte, ist der verstümmelte Expect-Header. Warum nimmst du den nicht raus?

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Hi,
      der Expect-Header ist absichtlich drin, weil er mir sonst einen "Expect: 100-[irgendwas]" rein haut. (auch ohne das funktioniert es übrigens nicht)(gleicher "Error")
      $filePath ist leer, weil er nicht genutzt wird in der Funktion.

      Das @ muss drin sein, sonst geht es nicht, da ist also nichts falsch.

      MfG
      karoo

      Kommentar


      • #4
        Achja, das mit dem @ war ja der Hinweis an CURL, nicht den Dateinamen zu senden, sondern den Dateiinhalt. Hatte ich vergessen.

        Gut, dann fällt mir auf Anhieb grad nichts mehr ein, außer, dass du den Upload mal auf deinen lokalen Server testen solltest.

        Das mit dem Expect-Header sieht nach einer Krücke aus. Wenn CURL den selbst reinschreibt, ist es sicherlich auch in der Lage, den 100-Status, der dann vom Server kommt, richtig zu verarbeiten. Meine Meinung dazu: Lass CURL sich mal lieber selbst drum kümmern, vor allem, wenn du sicher sein kannst, dass das mit dem Fehler nichts zu tun hat.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Bzgl. Expect: Wenn es der Server nicht unterstützt, kann man es wie der TO unterdrücken. Siehe PHP: curl_setopt - Manual

          Ich frage mich, wie der TO auf die Idee kommt, der Upload würde nicht funktionieren. Der Server antwortet doch mit Status 200.
          Dass das Bild letztlich beim Empfänger nicht auftaucht, liegt vielleicht daran, dass er es nicht mag, wenn man sich selbst Clients bastelt.
          Zuletzt geändert von onemorenerd; 24.11.2010, 18:52.

          Kommentar


          • #6
            Zitat von onemorenerd Beitrag anzeigen
            Bzgl. Expect: Wenn es der Server nicht unterstützt, kann man es wie der TO unterdrücken
            Ja, wenn, aber es ist offenbar ein HTTP/1.1-Server und er unterstützt es auch, sonst würde er mit 4xx antworten, sobald man den Header setzt.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Naja, ob der Server wirklich Expect unterstützt, wissen wir nicht. Der TO sagt, wenn er es nicht unterdrückt, bekommt er den "gleichen Error". Aber heißt das, er bekommt das "gleiche" Ergebnis (200) oder bekommt er einen "Error" (4xx)?

              Kommentar


              • #8
                Wieso steht dann nichts im Header?

                Kommentar


                • #9
                  Im Header steht doch alles, was drin stehen muss und der Body wird offenbar nicht angezeigt, was ja auch etwas nervig wäre.
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #10
                    Wann? In welchem Header?

                    Kommentar


                    • #11
                      Der Request-Header, der durch den Verbose Mode ausgegeben wird.

                      Edit: Ich glaube, jetzt verstehe ich auch den Titel dieses Threads. Du bist offenbar davon ausgegangen, dass der Dateiinhalt im Header stehen müsste. Das ist nicht (nie) der Fall. Bei einem Upload stehen die Nutzdaten genauso im Body, wie sie es bei einem Download tun. Die Boundary, die du siehst, ist auch keine öffnende, sondern nur die Definition des Boundary-String, damit die Gegenstelle weiß, wonach sie im Body suchen muss.
                      Zuletzt geändert von AmicaNoctis; 24.11.2010, 19:11.
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #12
                        Hi,
                        ah ok, das hat geholfen!
                        Das heißt ich muss die Anfrage wohl nur etwas besser "tarnen".

                        MfG
                        karoo

                        EDIT:
                        Eine Sache noch:
                        Der PIC-Hoster gibt mir Dateityp nicht unterstützt zurück. Kann es irgendwas damit zutun haben, dass keiner im header steht?
                        Zuletzt geändert von karoo; 24.11.2010, 19:19.

                        Kommentar


                        • #13
                          PHP: curl_setopt - Manual könnte helfen.

                          Kommentar


                          • #14
                            Der Content-Type des Bildes steht ja im Content-Header (also dem eigenen Header des entsprechenden multipart-Abschnitts, nicht im Anfrage-Header selbst). Daher lässt sich schlecht überprüfen, was CURL dort reinschreibt.

                            Aber ich hatte dir ja schon geraten, den Upload mal lokal zu testen. Jetzt wäre mal wieder ein weiterer guter Grund dafür da.
                            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                            Super, danke!
                            [/COLOR]

                            Kommentar


                            • #15
                              Ahoi,
                              lokal kommt das bei mir an:
                              Code:
                              Array
                              (
                                  [upload] => Upload
                              )
                              Array
                              (
                                  [userfile1] => Array
                                      (
                                          [name] => 576.jpg
                                          [type] => application/octet-stream
                                          [tmp_name] => /tmp/php2T0cLe
                                          [error] => 0
                                          [size] => 35239
                                      )
                              
                              )
                              Der Type verwundert mich etwas?

                              Kommentar

                              Lädt...
                              X