tutorial guzzlehttp example auth php api laravel guzzle guzzle6

php - guzzlehttp - guzzle verbose



Cargar archivo usando Guzzle 6 a punto final de API (2)

La forma en que está enviando datos a la POST es incorrecta, por lo tanto, los datos recibidos están mal formados

Guzzle docs :

El valor de multipart es una matriz de matrices asociativas, cada una de las cuales contiene los siguientes pares de valores clave:

name : (cadena, requerido) el nombre del campo de formulario

contents : (StreamInterface / resource / string, requerido) Los datos a usar en el elemento de formulario.

headers : (array) Matriz asociativa opcional de encabezados personalizados para usar con el elemento de formulario.

filename : (cadena) Cadena opcional para enviar como el nombre de archivo en la parte.

El uso de claves fuera de la lista anterior y la configuración de encabezados innecesarios sin separar cada campo en una matriz resultará en una solicitud incorrecta.

$res = $client->request(''POST'', $this->base_api . $endpoint, [ ''auth'' => [ env(''API_USERNAME''), env(''API_PASSWORD'') ], ''multipart'' => [ [ ''name'' => ''FileContents'', ''contents'' => file_get_contents($path . $name), ''filename'' => $name ], [ ''name'' => ''FileInfo'', ''contents'' => json_encode($fileinfo) ] ], ]);

Puedo cargar un archivo a un punto final de API utilizando Postman.

Estoy tratando de traducir eso en cargar un archivo desde un formulario, subirlo usando Laravel y publicar en el punto final usando Guzzle 6.

Captura de pantalla de cómo se ve en Postman (a propósito omití la URL POST)

A continuación se muestra el texto que genera al hacer clic en el enlace "Generar código" en POSTMAN:

POST /api/file-submissions HTTP/1.1 Host: strippedhostname.com Authorization: Basic 340r9iu34ontoeioir Cache-Control: no-cache Postman-Token: 6e0c3123-c07c-ce54-8ba1-0a1a402b53f1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="FileContents"; filename="" Content-Type: ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="FileInfo" { "name": "_aaaa.txt", "clientNumber": "102425", "type": "Writeoff" } ----WebKitFormBoundary7MA4YWxkTrZu0gW

A continuación se muestra la función del controlador para guardar el archivo y otra información. El archivo se carga correctamente, puedo obtener la información del archivo.

Creo que el problema que tengo es configurar la matriz de múltiples partes y encabezados con los datos correctos.

public function fileUploadPost(Request $request) { $data_posted = $request->input(); $endpoint = "/file-submissions"; $response = array(); $file = $request->file(''filename''); $name = time() . ''_'' . $file->getClientOriginalName(); $path = base_path() .''/public_html/documents/''; $resource = fopen($file,"r") or die("File upload Problems"); $file->move($path, $name); // { "name": "test_upload.txt", "clientNumber": "102425", "type": "Writeoff" } $fileinfo = array( ''name'' => $name, ''clientNumber'' => "102425", ''type'' => ''Writeoff'', ); $client = new /GuzzleHttp/Client(); $res = $client->request(''POST'', $this->base_api . $endpoint, [ ''auth'' => [env(''API_USERNAME''), env(''API_PASSWORD'')], ''multipart'' => [ [ ''name'' => $name, ''FileContents'' => fopen($path . $name, ''r''), ''contents'' => fopen($path . $name, ''r''), ''FileInfo'' => json_encode($fileinfo), ''headers'' => [ ''Content-Type'' => ''text/plain'', ''Content-Disposition'' => ''form-data; name="FileContents"; filename="''. $name .''"'', ], // ''contents'' => $resource, ] ], ]); if($res->getStatusCode() != 200) exit("Something happened, could not retrieve data"); $response = json_decode($res->getBody()); var_dump($response); exit(); }

El error que recibo, captura de pantalla de cómo se muestra con la vista de depuración de Laravel: