2017-10-26 5 views
0

Wie muss ich den folgenden Curl-Befehl in eine gültige PHP-Curl-Funktion "übersetzen"?cUrl mit JSON-String und Datei-Upload

curl -X POST 
    -F "[email protected]" 
    -F parameters=%7B%22classifier_ids%22%3A%5B%22testtype_205919966%22%5D%2C%22threshold%22%3A0%7D 
    'https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify?api_key={key}&version=2016-05-20'" 

Es scheint, dass ich etwas falsch mache, und ich kann das Problem nicht herausfinden:

$method = 'POST' 
$url = 'https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify?api_key=<myApiKey>&version=2016-05-20' 
$data = array(
    array(<file-information>), 
    array(<json-string>), 
) 
$header = array(
      'Content-Type: application/json', 
      'Content-Length: ' . strlen(<json-string>), 
       ) 
     ) 

public function send($method, $url, $data = null, $header = null) 
{ 
    $curl = curl_init(); 

    switch ($method) { 
     case "POST": 
      curl_setopt($curl, CURLOPT_POST, 1); 

      if ($data) { 
       $postData = $this->renderPostData($data); 
       curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); 
      } 
      break; 
    } 

    if($header) { 
     curl_setopt($curl, CURLOPT_HEADER, 1); 
     curl_setopt($curl,CURLOPT_HTTPHEADER,$header); 
    } 

    curl_setopt($curl, CURLOPT_URL, $url); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
    $response = curl_exec($curl); 
} 

protected function renderPostData($data) 
{ 
    $postData = array(); 
    foreach ($data as $file) { 
     if ($file['isFile']) { 
      if(pathinfo($file['path'], PATHINFO_EXTENSION) == 'zip'){ 
       $postData[$file['name']] = new \CURLFile($file['path'], 'application/zip', $file['name']); 
      } 
      else { 
       $postData[$file['name']] = new \CURLFile($file['path'], 'application/octet-stream', $file['name']); 
      } 
     } else { 
      // this contains the json encoded string 
      $postData[$file['name']] = $file['path']; 
     } 
    } 

    return $postData; 
} 

ich nun mehrere Varianten und die Watson von Visual Recognition API-Fehler versucht:

{ "custom_classes": 0, "Bilder": [{ "Fehler": { "description": „Inva Deckelbilddaten. Unterstützte Formate sind JPG und PNG ", "ERROR_ID.": "Input_error" } } ], "images_processed": 1 }

, bevor es war:

{ "Fehler": { "code": 400, "Beschreibung": "Ungültiger JSON-Inhalt wurde empfangen. Nicht in der Lage zu analysieren ", "ERROR_ID.": "PARAMETER_ERROR" }, "images_processed": 0 }

Vielen Dank für Ihre Hilfe

+0

Sie senden '$ data', aber Ihr' Inhalt-Length' Header gibt vor, die Größe der Anforderung war nur, dass die '', das ist nur ein Teil von '$ data'. – CBroe

+0

Das Ermitteln der korrekten Länge des assemblierten Anforderungskörpers sollte eigentlich _inside_ einer solchen 'send'-Methode angehören ... aber zuerst würde ich es ohne es versuchen - cURL sollte in der Lage sein, den korrekten Wert herauszufinden und diesen Header automatisch anzuhängen Wenn Sie eine Array-Datenstruktur an CURLOPT_POSTFIELDS übergeben – CBroe

+0

(Eigentlich sieht es so aus, als würden Sie keine $ Daten senden, sondern diese durchlaufen und erst dann die eigentlichen Upload-Dateien zur Datenstruktur hinzufügen ... aber in jedem Fall, Ihre Berechnung der Inhaltslänge scheint viel zu früh ...) – CBroe

Antwort

0

Mein Problem war diese Linie:

$postData[$file['name']] = new \CURLFile($file['path'], 'application/zip', $file['name']); 

der letzte Parameter ist der $ postname Also dieses Problem zu beheben ich diese Zeile ändern musste.

$postData[$file['name']] = new \CURLFile($file['path'], mime_content_type($file['path']), basename($file['path'])); 

und es funktioniert - nachdem ich auch die falschen $header vollständig

entfernt :)