• 0
sergiolimo

Adjuntar archivo

Question

Buenas tardes! Estoy muy trabado desde hace unos dias, necesito saber como puedo adjuntar un archivo en un mensaje post venta, ya lei la documentacion, que es poca para este punto, y puedo enviar mensajes perfectamente pero no los adjuntos! Lo que no termino de entender es el procedimiento

Yo lo que hice fue mediante mi aplicacion, subir el archivo a una carpeta temporal (ejemplo https://www.soloprueba.com/archivo.jpg) y desde alli hacer la llamada con la ruta file=https://www.soloprueba.com/archivo.jpg (aca es donde hago agua, seguramente esta mal esto)... pero siempre da error File attachment must be present

Luego a modo de prueba intente directo desde el disco local y tampoco doy con la ruta...

Me podrian explicar por favor como es el procedimiento? o sea desde donde lo tengo que leer y un ejemplo de ruta (consulte a soporte y realmente me confundieron mas, ya que me respondieron exactamente: Te cuento que no es posible enviar una ruta de un servidor, se debe descarga previamente, guardarla localmente y luego con esa ruta, como por ejemplo /Users/Downloads/Banner.jpg, enviarlo mediante la api)

Descargarlo? para que lo subo y luego lo descargo, no entendi el mensaje... guardarlo localmente? pero si originalmente esta asi, localmente! y me dio una ruta de ejemplo relativa, no se donde tiene que estar el archivo!! Ya no se si volver a consultarle ya que entramos como en bucle

Gracias de antemano por la ayuda!

Share this post


Link to post
Share on other sites

24 answers to this question

Recommended Posts

  • 1

La solucion para subir archivos desde PHP con CURL para la API de mensajeria

$url = "https://api.mercadolibre.com/messages/attachments?access_token=APP_XXXXXXXXXXXXXX;

$args['file'] = new CurlFile('test.jpg', 'image/jpg', 'test.jpg');

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER,array('Content-Type: multipart/form-data'));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $args); // post images
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // if any redirection after upload
$r = curl_exec($curl);
curl_close($curl);

Odiosas 4hs !!!! 

:40_rage:

Share this post


Link to post
Share on other sites
  • 0

Depende mucho de en qué programás qué tan fácil es, pero básicamente se trata de hacer un request en donde le pasas el archivo como multipart data: https://stackoverflow.com/questions/1378920/how-can-i-make-a-multipart-form-data-post-request-using-java

 https://www.techcoil.com/blog/how-to-upload-a-file-via-a-http-multipart-request-in-java-without-using-any-external-libraries/

 

Hay mucho en internet una vez que sabes qué buscar.

Share this post


Link to post
Share on other sites
  • 0

Si, hasta ahi llego, subo el archivo que quiero adjuntar a una carpeta temporal con un metodo similar al que pones en el link, hasta ahi no hay problema... mi problema viene al hacer el POST de la api, no se como poner la ruta file=xxxxxx ya que ponga lo que ponga me devuelve el error "File attachment must be present"

Y al consultar con soporte, me desconcertó del todo al recibir esta respuesta: "Te cuento que no es posible enviar una ruta de un servidor, se debe descarga previamente, guardarla localmente y luego con esa ruta, como por ejemplo /Users/Downloads/Banner.jpg, enviarlo mediante la api" ... luego me paso un ejemplo con una ruta desde el disco c:

Entonces entendi que hay que poner la ruta desde el disco duro del cliente??? y descarté la logica que es la que me decis de hacer, que es subir el archivo a un temporal y desde ahi darle la ruta al post, ahi es donde estoy perdido!!

Entonces, como hago? Tengo el archivo subido con multipart data como me indicas en  https://www.soloprueba.com/archivo.jpg (como ejemplo) ... lo subo desde ahi? descarto esto como me dijeron en soporte y lo subo desde c: ??? en cualquier caso como se pone la ruta f=xxxxx?

 

$parametros = array(
                            "-F" => "file=?????????"
                            )
                         ;
    
        $art = $meli->post("https://api.mercadolibre.com/messages/attachments?access_token=".$_SESSION['access_token'],$parametros);

Share this post


Link to post
Share on other sites
  • 0

En ningún momento tenés que usar una ruta, al hacer upload del attachment mediante multipart data, la api te devuelve un id que luego es el que tenés que usar al enviar el mensaje. Si tenés curl podés probar con el ejemplo que hay en la documentación, y hay forma de mostrar más detallado lo que esta haciendo curl al enviar el request

Share this post


Link to post
Share on other sites
  • 0

Probe el ejemplo de la documentacion con un archivo de prueba pero me sigue saliendo el error 400! No se si hago algo mal!!

$url = "https://api.mercadolibre.com/messages/attachments?access_token=".$_SESSION['access_token'];
 
        $ch = curl_init();
        $ruta = '@' . realpath('c:/prueba.png');
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array("file" => $ruta))); 
 
        $art = curl_exec($ch);

Share this post


Link to post
Share on other sites
  • 0

Tambien probe en lugar de ponerle la ruta al disco como me dijeron en soporte, recibir por post el archivo y me da otro error "File attachment must not be empty"

de esta forma: (traigo por post en file el archivo)

$url = "https://api.mercadolibre.com/messages/attachments?access_token=".$_SESSION['access_token']; 
$filename = $_FILES['file']['name'];
$filedata = $_FILES['file']['tmp_name'];
$filesize = $_FILES['file']['size'];

if ($filedata != '')
{
    $headers = array("Content-Type:multipart/form-data");
    $path = $_SERVER["DOCUMENT_ROOT"];
    $postfields = array("file" => '@'.$path.'/'.$filename);
    $ch = curl_init();
    $options = array(
        CURLOPT_URL => $url,
        CURLOPT_HEADER => true,
        CURLOPT_POST => 1,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_POSTFIELDS => $postfields,
        CURLOPT_INFILESIZE => $filesize,
        CURLOPT_RETURNTRANSFER => true
    );
    curl_setopt_array($ch, $options);
    $art = curl_exec($ch);
    if(!curl_errno($ch))
    {
        $info = curl_getinfo($ch);
        if ($info['http_code'] == 200)
            $errmsg = "ok";
            echo $art;
    }
    else
    {
        $errmsg = curl_error($ch);
    }
    curl_close($ch);
}
else
{
    $errmsg = "nada";
}
}

Share this post


Link to post
Share on other sites
  • 0

Tendrías que mirar el request que estás enviando para saber qué está mal. Una forma es en vez de usar la api de ml usar https://httpbin.org/post que te devuelve en formato json la info que posteaste. En el primer ejemplo casi seguro que el json_encode no va, en el segundo ejemplo pareciera bien, tal vez hay algún error con la url del archivo. Pero fijate que te devuelve httpbin

Share this post


Link to post
Share on other sites
  • 0

Mmm ahi lo reformé pero me sigue dando el error 400 

"message":"File attachment must not be empty","error":"bad_request","status":400,"cause":[]

$url = "https://api.mercadolibre.com/messages/attachments?access_token=".$_SESSION['access_token'];
 
        $cfile = new CURLFile(realpath('c:/prueba.pdf'));
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);   
        curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);  
        curl_setopt($ch, CURLOPT_TIMEOUT, 100);
        curl_setopt($ch, CURLOPT_POSTFIELDS, array("file" => $cFile)); 
    
        $art = curl_exec($ch);
    
        print_r($art);
        

Share this post


Link to post
Share on other sites
  • 0

curl -i -XPOST -H "Content-Type: multipart/form-data" -F "file=@test.jpg" "https://api.mercadolibre.com/messages/attachments?access_token=APP_USR-0__N_K__-0"

Esto funciona perfectamente (Gracias al que hizo el ejemplo en la documentación, es ilegible, parece que tuvo un problema con el charset !!!!)

El problema esta del lado del formateo del CURL en PHP.

HTTP/1.1 201 Created
Date: Wed, 29 Nov 2017 06:17:08 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Content-Type-Options: nosniff
X-Request-Id: 408b8416-d201-4a68-9a94-c6466cb577eb
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS
Access-Control-Max-Age: 86400
Vary: Accept-Encoding, User-Agent

{"id":"480aaaaaa_9253d22c-e1ee-4673-b47e-aa79a1a4ab2c.jpg"}

Share this post


Link to post
Share on other sites
  • 0
8 hours ago, maxiconta said:

La solucion para subir archivos desde PHP con CURL para la API de mensajeria


$url = "https://api.mercadolibre.com/messages/attachments?access_token=APP_XXXXXXXXXXXXXX;

$args['file'] = new CurlFile('test.jpg', 'image/jpg', 'test.jpg');

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER,array('Content-Type: multipart/form-data'));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $args); // post images
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // if any redirection after upload
$r = curl_exec($curl);
curl_close($curl);

Odiosas 4hs !!!! 

:40_rage:

Por lo menos multipart te viene soportado en php, a mí me tardó 2 días definir el protocolo multipart para poder enviar archivos ^^

Share this post


Link to post
Share on other sites
  • 0

Gracias Maxiconta por tu ayuda!  Una duda, cual seria el path completo del archivo en tu ejemplo? Esta en el disco? (no termino de entender ese paso)

Sigo sin poder implementarlo, no se de donde lo estas tomando... por ejemplo con este codigo, no me da ninguna respuesta

Seguramente sigo con el problema de los path cuando quiero recibir el archivo desde el form

 

$url = "https://api.mercadolibre.com/messages/attachments?access_token=".$_SESSION['access_token']; 
    $filename = $_FILES['archivo']['name'];
    $filedata = $_FILES['archivo']['tmp_name'];
    
    $args['file'] = new CurlFile($filename, $filedata, $filename);
    
    $curl = curl_init();
    
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HTTPHEADER,array('Content-Type: multipart/form-data'));
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // stop verifying certificate
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $args); // post images
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // if any redirection after upload
    curl_close($curl);
    
    $art = curl_exec($curl);
    
    print_r($art); 

 

 

Share this post


Link to post
Share on other sites
  • 0

En que entorno lo estas probando?

Lo probe desde Windows con un path c:\dir\test.jpg

Probalo derecho sin variables antes de parsearlo

$args['file'] = new CurlFile('test.jpg', 'image/jpg', 'test.jpg');

Pone un archivo en el mismo DIR que el archivo para evitar cualquier problema del path.

Share this post


Link to post
Share on other sites
  • 0
On 11/29/2017 at 2:19 AM, Maximiliano Contartesi said:

curl -i -XPOST -H "Content-Type: multipart/form-data" -F "file=@test.jpg" "https://api.mercadolibre.com/messages/attachments?access_token=APP_USR-0__N_K__-0"

Esto funciona perfectamente (Gracias al que hizo el ejemplo en la documentación, es ilegible, parece que tuvo un problema con el charset !!!!)

El problema esta del lado del formateo del CURL en PHP.

HTTP/1.1 201 Created
Date: Wed, 29 Nov 2017 06:17:08 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Content-Type-Options: nosniff
X-Request-Id: 408b8416-d201-4a68-9a94-c6466cb577eb
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS
Access-Control-Max-Age: 86400
Vary: Accept-Encoding, User-Agent

{"id":"480aaaaaa_9253d22c-e1ee-4673-b47e-aa79a1a4ab2c.jpg"}

eeeeeeeeeeeee ?? aun funciona esto. ??? por que me sigue saliendo el mismo error de no hay archivo, estoy intentando subir un pdf de 20 Kb

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now