[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
murilo
Criador murilo 22/04/2024

ola carlos, não sei oque fiz de errado aqui no file upload na API Gateway .
ta dando esse errro aqui no update company  -

public function updateCompany(string $identify, array $params = [], UploadedFile $image = null)
{
if ($image)
$this->http->attach('image', file_get_contents($image->getPathname()), $image->getClientOriginalName());

da esse erro -

{
"message": "json_encode error: Malformed UTF-8 characters, possibly incorrectly encoded",
"exception": "GuzzleHttp\\Exception\\InvalidArgumentException",
"file": "/var/www/html/vendor/guzzlehttp/guzzle/src/Utils.php",
"line": 298,
"trace": [

 

se eu uso o asForm() ele nao da o erro -

$response = $this->http->asForm()->put($this->url . '/' . $identify, $params);
 

mas tbem nao envia o anexo .

 

Criador murilo 22/04/2024

opa carlos, o erro nao eh esse nao , é este aqui -

message": "A 'contents' key is required",
"exception": "InvalidArgumentException",
"file": "/var/www/html/vendor/guzzlehttp/psr7/src/MultipartStream.php",
murilo
Criador murilo 22/04/2024

Carlos , no meu caso ai . não sei porque . ele está exigindo que eu mande os parametros ao inves de assim 

[
"status" => "active",
"name" => "joe",
"folder" => "123",
"password" => "123456",
"email" => "joe233@gmail",
"image_profile" => "image.jpg"
]

 

ENVIE ASSIM -

[
["name" => "status" , "contents" => "active"],
["name" => "name" , "contents" => "joe"],
["name" => "folder" , "contents" => "123"],
["name" => "password" , "contents" => "123456"],
["name" => "email" , "contents" =>"joe233@gmail"],
['name' => 'image_profile', 'contents' => 'image.jpg']
]

 

isso quando eu uso o attach -

$this->http->attach('image', file_get_contents($image->getPathname()), $image->getClientOriginalName());


ai ele exige que eu envie o formulario naquele formato , vc ja viu isso ? estranho neh 

murilo
Manager Carlos Ferreira 22/04/2024

Olá, Murilo!

Tudo bem?

 

Compartilhe o código comigo, que te ajudo a identificar onde vc errou.

Carlos Ferreira
Criador murilo 22/04/2024

olá carlos . então . depois de dois dias aqui tentando . acho que eu achei uma forma que funcionou .
só nao entendi pq no seu código nao deu o erro , mas no meu deu . talvez foi a versão do laravel ( usei a versao 10 ) ou a configuração do docker ou algum header que vc usou la no postman   .
não siei oque aconteceu .

vi que algumas pesoas tbem estava com esta duvida -
https://laracasts.com/discuss/channels/code-review/send-uploadedfile-instances-using-http-client

aqui nesta funcçao ele dava o error , pq mudava o tipo de formulário pra multpart assim que usa o attach .

public function updateCompany(string $identify, array $params = [], UploadedFile $image = null)
{
if ($image)
$this->http->attach('image', file_get_contents($image->getPathname()), $image->getClientOriginalName());

$response = $this->http->put($this->url . '/' . $identify, $params);
 
return response()->json(json_decode($response->body()), $response->status());
}


da esse error aqui -

message": "A 'contents' key is required",
 
"exception": "InvalidArgumentException",
 
"file": "/var/www/html/vendor/guzzlehttp/psr7/src/MultipartStream.php",

 

e parece que tinha que mudar o format do parametros  pra esse aqui -

}


$params = [
[
[
'name' => 'name',
'contents' => 'bob',
],
[
'name' => 'image',
'contents' => 'image.jpg',
],
]
];

 

então eu achei esta função aqui , que transforma o parametros neste formato
https://stackoverflow.com/questions/41587134/guzzle-post-multipart-request-with-nested-array


então ficaria assim -

public function updateCompany(string $identify, array $params = [], UploadedFile $image = null)
{
if ($image)
$this->http->attach('image', file_get_contents($image->getPathname()), $image->getClientOriginalName());

$response = $this->http->put($this->url . '/' . $identify, $this->transformMultiFormData($params));
 
return response()->json(json_decode($response->body()), $response->status());
}

private function transformMultiFormData ($data) {
$output = [];

foreach($data as $key => $value){
if(!is_array($value)){
$output[] = ['name' => $key, 'contents' => $value];
continue;
}

foreach($value as $multiKey => $multiValue){
$multiName = $key . '[' .$multiKey . ']' . (is_array($multiValue) ? '[' . key($multiValue) . ']' : '' ) . '';
$output[] = ['name' => $multiName, 'contents' => (is_array($multiValue) ? reset($multiValue) : $multiValue)];
}
}
return $output;
}


bom, funciou aqui , o request ta funcionando tbem .  

murilo
Manager Carlos Ferreira 22/04/2024

Que bom que conseguiu fazer funcionar, meus parabéns!!!

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!