Me gustaría usar cURL no solo para enviar parámetros de datos en HTTP POST sino también para cargar archivos con un nombre de formulario específico. ¿Cómo debo hacer eso?
Parámetros de publicación HTTP:
userid = 12345 filecomment = Este es un archivo de imagen
Carga del archivo HTTP: Ubicación del archivo = /home/user1/Desktop/test.jpg Nombre del formulario para el archivo = imagen (corresponde a $ _FILES ['imagen'] en el lado de PHP)
Imaginé parte del comando cURL de la siguiente manera:
curl -d "userid=1&filecomment=This is an image file" --data-binary @"/home/user1/Desktop/test.jpg" localhost/uploader.php
El problema que tengo es el siguiente:
Notice: Undefined index: image in /var/www/uploader.php
El problema es que estoy usando $ _FILES ['imagen'] para recoger archivos en el script PHP.
¿Cómo ajusto mis comandos cURL en consecuencia?
-d
opción por error, que necesita la entrada codificada en URL. Debería haberlo eliminado cuando actualicé la respuesta a la-F
opción. Gracias por atrapar eso.@
enimage=@/..
?Capturando la identificación de usuario como variable de ruta (recomendado):
Capturando la identificación de usuario como parte del formulario:
o:
fuente
"Content-Type: multipart/form-data"
Aquí está mi solución, he estado leyendo muchas publicaciones y fueron realmente útiles. Finalmente escribí un código para archivos pequeños, con cURL y PHP que creo que es realmente útil.
Con esto deberíamos estar en el "api.endpoint.post" que publican los siguientes vars. Puede probar fácilmente con este script, y debería recibir estos debugs en la función
postFile()
en la última fila.Debería funcionar bien, pueden ser mejores soluciones, pero esto funciona y es realmente útil para comprender cómo funciona el límite y el mimo multiparte / desde datos en PHP y la biblioteca cURL.
fuente
si está cargando un archivo binario como csv, use el formato siguiente para cargar el archivo
fuente
--data-binary
indicacurl
que no se realice ningún procesamiento previo de los datos, en lugar de--data
marcar. para abordar su comentario directamente, tenga en cuenta que el texto también es binario, pero podemos interpretarlo como caracteres ASCII. Si realmente quieres un ejemplo distinto, piensa en un CSV cuyos campos contengan emoji. Sus bytes no se asignan directamente al textoEl problema que me llevó aquí resultó ser un error básico del usuario: no estaba incluyendo el
@
signo en la ruta del archivo y curl estaba publicando la ruta / nombre del archivo en lugar de los contenidos. PorContent-Length
lo tanto, el valor era 8 en lugar de los 479 que esperaba ver dada la legibilidad de mi archivo de prueba.El
Content-Length
encabezado se calculará automáticamente cuando curl lea y publique el archivo.curl -i -H "Content-Type: application/xml" --data "@test.xml" -v -X POST https://<url>/<uri/
... <Contenido-Longitud: 479 ...
Publicar esto aquí para ayudar a otros novatos en el futuro.
fuente
Como alternativa
curl
, puede usar HTTPie , es una CLI, una herramienta similar a cURL para humanos.Instrucciones de instalación: https://github.com/jakubroztocil/httpie#installation
Entonces corre:
fuente
Después de muchos intentos, este comando funcionó para mí:
fuente
Aquí se explica cómo escapar correctamente de los nombres de archivos arbitrarios de los archivos cargados con
bash
:fuente
Lo hice funcionar con este comando
curl -F 'filename=@/home/yourhomedirextory/file.txt' http://yourserver/upload
fuente