• 0
mendoca

Erro ao enviar imagem

Question

6 answers to this question

Recommended Posts

  • 0

Caro Mendoca,

é óbvio o que está errado, o sistema também indicou qual é o erro.

$motivo = "Você não" concatenou a string corretamente";

Veja no exemplo acima o que está errado e verifique o seu código.

Outra coisa que parece estar errado, ou pelo menos estranho, é o endereço físico do arquivo, onde deveria ser a URL de visualização da imagem.

Share this post


Link to post
Share on other sites
  • 0
13 minutes ago, rodrigojob said:

Caro Mendoca,

é óbvio o que está errado, o sistema também indicou qual é o erro.

$motivo = "Você não" concatenou a string corretamente";

Veja no exemplo acima o que está errado e verifique o seu código.

Outra coisa que parece estar errado, ou pelo menos estranho, é o endereço físico do arquivo, onde deveria ser a URL de visualização da imagem.

Ele está passando o path real da hospedagem dele . Eu tenho a impressão que ele está tentando enviar o arquivo como mime . Eu acho que é um processo relativamente complexo e muito fácil de dar errado , não vale a pena

Share this post


Link to post
Share on other sites
  • 0

eu envio as informação via curl então para mandar um arquivo estou criando um curlfile usando essa função:

    public function makeCurlFile($file){
        $mime = mime_content_type($file);
        $info = pathinfo($file);
        $name = $info['basename'];
        $output = new CURLFile($file, $mime, $name);
        return $output;
    }

 

o retorno dela eu passo para a função de upload

 

    public function uploadPictures($file){

        $this->getAccess();

        $url = parent::$API_DOMAIN.'/pictures?access_token='.$this->accessToken;
        $param = array(
            'source' => $file
        );

        $data = $this->callAPI($url,'POST', json_encode($param), false, true);
        return $data;
    }

 

a função do curl é esta abaixo:

 

 public function callAPI($url, $method='GET', $data = false, $header=array(), $file=false){

         $curl = curl_init();
         $body = $data;
         switch ($method){
              case "POST":
                 if (is_array($data)) {
                            curl_setopt($curl, CURLOPT_POST, 1);
                            if($file){
                                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                            }else{
                                curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
                            }              
                     }else{
                            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
                            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                     }
                break;
              case "PUT":
                    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
                    if (is_array($data)) {
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
                    }else{
                      curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                    }
                break;
              case "DELETE":
                    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
                    break;
              default:
                    if ($data)
                         $url = sprintf("%s?%s", $url, http_build_query($data));
         }

         curl_setopt($curl, CURLOPT_URL, $url);
         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
     curl_setopt($curl, CURLOPT_SSLVERSION, 4);

         if(is_array($header) && !empty($header)){
           curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
         }
       $this->error='';
         $content= curl_exec($curl);
         $information = curl_getinfo($curl);

     $data = json_decode($content);
         curl_setopt($curl, CURLOPT_HEADER, true);
         $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
         if($httpcode == 0){
       $this->setErrorML($this->error, $url, $method, $data, $body);
           $this->error=' Connection Error: - '.curl_error($curl);
         }elseif($httpcode == 400 || $httpcode == 401 || $httpcode == 403  || $httpcode == 404 || $httpcode == 405 || $httpcode == 406 || $httpcode == 407 || $httpcode == 409 || $httpcode == 410 || $httpcode == 500 || $httpcode == 501 || $httpcode == 502){
      
            $this->error=(property_exists($data,'error'))?$data->error:'';

            if(property_exists($data,'cause') && isset($data->cause[0]) && property_exists($data->cause[0],'code')) {
               $this->error=$data->cause[0]->code.' - '.$data->cause[0]->message;
            }elseif(property_exists($data,'cause') && isset($data->cause[0])){
               $this->error.=' - '.$data->cause[0];
            }elseif(property_exists($data,'message')){
               $this->error.=' - '.$data->message;
            }else{
               if(strpos($url,'items/validate')!==false){
                 $this->error.=' - Validation failed.';
               }
             }

       $this->setErrorML($this->error, $url, $method, $data, $body);

             return false;
         }else{
             return $data;
         }

    } 

é assim que estou subindo as imagens mas erro ele esta trocando o surce da imagem pelo name isso que esta me deixando confuso e ate onde vi os parametros para criar o curlfile estão corretos

Edited by mendoca

Share this post


Link to post
Share on other sites
  • 0
1 hour ago, mendoca said:

eu envio as informação via curl então para mandar um arquivo estou criando um curlfile usando essa função:

    public function makeCurlFile($file){
        $mime = mime_content_type($file);
        $info = pathinfo($file);
        $name = $info['basename'];
        $output = new CURLFile($file, $mime, $name);
        return $output;
    }

 

o retorno dela eu passo para a função de upload

 

    public function uploadPictures($file){

        $this->getAccess();

        $url = parent::$API_DOMAIN.'/pictures?access_token='.$this->accessToken;
        $param = array(
            'source' => $file
        );

        $data = $this->callAPI($url,'POST', json_encode($param), false, true);
        return $data;
    }

 

a função do curl é esta abaixo:

 

 public function callAPI($url, $method='GET', $data = false, $header=array(), $file=false){

         $curl = curl_init();
         $body = $data;
         switch ($method){
              case "POST":
                 if (is_array($data)) {
                            curl_setopt($curl, CURLOPT_POST, 1);
                            if($file){
                                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                            }else{
                                curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
                            }              
                     }else{
                            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
                            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                     }
                break;
              case "PUT":
                    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
                    if (is_array($data)) {
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
                    }else{
                      curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                    }
                break;
              case "DELETE":
                    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
                    break;
              default:
                    if ($data)
                         $url = sprintf("%s?%s", $url, http_build_query($data));
         }

         curl_setopt($curl, CURLOPT_URL, $url);
         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
     curl_setopt($curl, CURLOPT_SSLVERSION, 4);

         if(is_array($header) && !empty($header)){
           curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
         }
       $this->error='';
         $content= curl_exec($curl);
         $information = curl_getinfo($curl);

     $data = json_decode($content);
         curl_setopt($curl, CURLOPT_HEADER, true);
         $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
         if($httpcode == 0){
       $this->setErrorML($this->error, $url, $method, $data, $body);
           $this->error=' Connection Error: - '.curl_error($curl);
         }elseif($httpcode == 400 || $httpcode == 401 || $httpcode == 403  || $httpcode == 404 || $httpcode == 405 || $httpcode == 406 || $httpcode == 407 || $httpcode == 409 || $httpcode == 410 || $httpcode == 500 || $httpcode == 501 || $httpcode == 502){
      
            $this->error=(property_exists($data,'error'))?$data->error:'';

            if(property_exists($data,'cause') && isset($data->cause[0]) && property_exists($data->cause[0],'code')) {
               $this->error=$data->cause[0]->code.' - '.$data->cause[0]->message;
            }elseif(property_exists($data,'cause') && isset($data->cause[0])){
               $this->error.=' - '.$data->cause[0];
            }elseif(property_exists($data,'message')){
               $this->error.=' - '.$data->message;
            }else{
               if(strpos($url,'items/validate')!==false){
                 $this->error.=' - Validation failed.';
               }
             }

       $this->setErrorML($this->error, $url, $method, $data, $body);

             return false;
         }else{
             return $data;
         }

    } 

é assim que estou subindo as imagens mas erro ele esta trocando o surce da imagem pelo name isso que esta me deixando confuso e ate onde vi os parametros para criar o curlfile estão corretos

você está partindo do mais difícil, realize primeiro o upload das imagens conforme está no manual em:

https://developers.mercadolivre.com.br/pt_br/trabalho-com-imagens#Como-fazer-upload-de-uma-imagem

depois, de forma simples implemente outras funcionalidades caso necessite

 

estas funções foi você que escreveu ou pegou online?

Share this post


Link to post
Share on other sites
  • 0

Acho que você precisa voltar atrás um pouco pra entender alguns conceitos mais básicos. A sua chamada de upload é para enviar somente o caminho de uma imagem já hospedada. Se você criou um curlfile, não vejo sentido chamar um json_encode para ele. Você precisa entender quais são os dados com os quais está trabalhando para entender o que pode ou não ser feito com eles. Do jeito que você fez está enviando apenas textos (strings) e por isso não funciona. Nem sempre o SDK do ML irá prover tudo que você precisa. Em alguns casos, como este, é necessário criar uma nova chamada específica para atender o que você precisa. Lembre-se também que às vezes, mesmo que o seu código consiga enviar dados em um formato, é necessário que a API esteja preparada para receber e tratar os dados no mesmo formato.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.