¿Cambiar el nombre del archivo de carga en cURL?

Quiero subir un archivo usando cURL. Como cURL requiere una ruta completa al archivo, aquí está mi código:

curl_setopt($ch, CURLOPT_POSTFIELDS, array("submit" => "submit", "file" => "@path/to/file.ext")); curl_exec($ch); 

Sin embargo, cURL también publicará esta ruta completa del archivo en el encabezado de la solicitud:

Content-Disposition: form-data; name = “archivo”; filename = “/ path / to / file.ext”

Pero quiero que sea solo

Content-Disposition: form-data; name = “archivo”; filename = “archivo.ext”

Así que cambio el código a

 curl_setopt($ch, CURLOPT_POSTFIELDS, array("submit" => "submit", "file" => "@file.ext")); chdir("path/to"); # change current working directory to where the file is placed curl_exec($ch); chdir("path"); # change current working directory back 

Y luego cURL simplemente lanza un mensaje de error

no se pudo abrir el archivo “file.ext”

¿Alguien puede decirme cómo hacerlo, por favor?

Nuevo método (desde PHP 5.5) usando CURLFile :

 $file = new CURLFile('path/to/file.ext'); $file->setPostFilename('file.ext'); 

usarlo casi de la misma manera

 "file" => $file 

Método antiguo :

En lugar de

 "file" => "@path/to/file.ext" 

puedes decirle a cURL que use otro nombre de archivo:

 "file" => "@path/to/file.ext; filename=file.ext" 

De esa forma usará path/to/file.ext como fuente de archivo, pero file.ext como nombre de archivo.

Sin embargo, necesitará una ruta muy absoluta, por lo que es probable que le falte un / : /path/to/file.ext . Como usas PHP, siempre haz un realpath() :

 "file" => '@' . realpath($pathToFile) . '; filename=' . basename($pathToFile); 

O algo así.

Corrígeme si me equivoco, pero la carga de cURL no funcionará con la ruta relativa. Siempre necesita una ruta absoluta, me gusta

 $realpath = realpath($uploadfile); 

Por lo tanto, si alguien quiere ocultar la ubicación de su archivo en su servidor web al cargarlo, muévalo a una carpeta temporal o use fsockopen () (vea este ejemplo en las Notas de Contribución del usuario de PHP Manual).

Necesitará colocar el archivo en un área temporal y luego consultar el archivo desde allí si quiere ocultar la ubicación verdadera del archivo. Desafortunadamente, cURL no admite el envío de solo datos binarios, de lo contrario, podría enviar la cadena de datos base64 o binaria en lugar de una referencia de nombre de archivo.