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
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:
$body = fopen(''/path/to/file'', ''r'');
$r = $client->request(''POST'', ''http://httpbin.org/post'', [''body'' => $body]);
http://docs.guzzlephp.org/en/latest/quickstart.html?highlight=file