2012-08-11 18 views
5

Tengo un pequeño problema aquí, ¿cómo puedo decirle específicamente a cURL que adjunte un archivo a una solicitud?¿Utiliza cURL para subir un archivo sin el símbolo @?

Si yo estoy cargando un archivo con doblez, entonces el método común es para adjuntarlo como parte de la matriz de datos POST con el valor que tiene @ delante de él, por ejemplo:

CURLOPT_POSTFIELDS=>array('my-file'=>'@my-file.txt') 

Esto, obviamente, trabajo, pero tengo dos problemas con él:

  • ¿Qué pasa si no es realmente un archivo que estoy cargando? ¿Qué pasa si mi valor POST en realidad ES '@ my-file.txt' e intenta cargar el archivo en su lugar? Crea una laguna que estoy tratando desesperadamente de evitar.
  • ¿Cómo puedo cargar un archivo desde una URL? ¿Tendría que descargarlo, almacenarlo en una carpeta temporal y luego adjuntarlo con @ desde esa carpeta temporal? ¿Por qué no puedo dar CURL solo a los contenidos que deseo utilizar como archivo?

cURL CURLOPT_INFILE no es una opción, ya que no aparecerá como parte de la matriz $ _FILES.

Parece que una laguna en cURL depende del símbolo @ en el valor del campo POST. ¿Hay alguna forma de evitarlo? ¿Por qué no hay una matriz CURLOPT_FILEFIELDS? La línea de comandos cURL tiene una bandera separada para esto (-F), pero por alguna razón no la veo como una opción en PHP.

¡Cualquier ayuda sería muy apreciada, gracias!

+1

En cuanto a la laguna, esto parece no ser corregido: https://bugs.php.net/bug.php?id=46439 tendrá que verificar manualmente la presencia de '@' al verificar los valores de entrada. –

+0

Tal vez ['http_build_query'] (http://php.net/http_build_query), como en [esta respuesta] (http://stackoverflow.com/a/648296/773625)? – mAu

+0

Gracias Pekka, solo desearía que hubiera una solución. Pero mAu: Esto no funciona, ya que mi API necesitaría soportar cargas de archivos también. Todo estaría bien si fuera posible enviar archivos por separado de los campos de POST y también tengo que enviar algunos datos en POST (ya que hay límites para GET que no están ahí para el POST). – kingmaple

Respuesta

1

Lo que terminé haciendo es detectar si alguno de los datos de entrada comenzó con un símbolo @ y si lo hicieron, luego enviándolos como una variable GET (como parte de la URL de envío en cURL). No ayuda con todos los casos (como cuando se envía una cadena grande que comienza con un @), pero elimina los problemas que tuve con los controles de Twitter.

Cuestiones relacionadas