2011-01-31 16 views
5

Cuando uso linux y trato de subir el archivo al servidor remoto usando este script, todo está bien. Pero si uso Windows, el script no funciona. Guión:cURL cargar archivos en el servidor remoto en MS Windows

$url="http://site.com/upload.php"; 
$post=array('image'=>'@'.getcwd().'images/image.jpg'); 
$this->ch=curl_init(); 
curl_setopt($this->ch, CURLOPT_URL, $url); 
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($this->ch, CURLOPT_TIMEOUT, 30); 
curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt($this->ch, CURLOPT_POST, 1); 
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post); 
$body = curl_exec($this->ch); 
echo $body; // << on Windows empty result 

¿Qué estoy haciendo mal?

PHP 5.3

Windows 7 - No trabajo, Ubuntu Linux 10.10 - trabajando

+0

¿Tiene cURL compilados en su instalación PHP en tu servidor de Windows? Muestra el mensaje de error dado. Puede verificar la instalación a través de una secuencia de comandos [phpinfo()] (http://php.net/manual/en/function.phpinfo.php). – Orbling

+0

Error no mostrado. (error_reporting = on) – Dador

+0

getcwd() no regresa con una barra al final, así que me falta esa, además ¿no debería usar una barra invertida en Windows en lugar de una barra diagonal? –

Respuesta

4

Si está utilizando Windows, el separador de ruta del archivo será \ no el de Linux /.

Una cosa obvia a tratar es

$post=array('image'=>'@'.getcwd().'images\image.jpg'); 

Y ver si funciona.

Si desea hacer su escritura portátil para que funcione con Windows o Linux, puede utilizar PHP's predefined constantDIRECTORY_SEPARATOR

$post=array('image'=>'@'.getcwd().'images' . DIRECTORY_SEPARATOR .'image.jpg'); 
+0

Nice answer. consiguiendo algo nuevo –

4

Teóricamente, su código no debería funcionar (me refiero a subir) en cualquier unix o ventanas Considere esta porción de su código:

'image'=>'@'.getcwd().'images/image.jpg' 

En las ventanas getcwd() devuelve F:\Work\temp
En Linux devuelve /root/work/temp

lo tanto, su código se compilará como a continuación:

de Windows: 'image'=>'@F:\Work\tempimages/image.jpg'
Linux : 'image'=>'@/root/work/tempimages/image.jpg'

Desde que mencionaste que funcionó para ti en Linux, lo que significa que /root/work/tempimages/image.jpg de alguna manera existió en tu sistema de archivos.

Mi versión de PHP:
Linux: PHP 5.1.6
de Windows: PHP 5.3.2

+1

Sí, esto es observable. buena respuesta. –

1

Usted debe tratar var_dump($body) para ver lo que realmente contiene $body. Con la forma en que configuró cURL, $body contendrá la respuesta del servidor o falsa, en caso de error. No hay forma de diferenciar entre una respuesta vacía o falsa con echo. Es posible que la solicitud esté pasando muy bien, y el servidor simplemente no devuelve nada.

Sin embargo, como han dicho otros, su ruta de archivo parece inválida. getcwd() no genera un / final y deberá agregar uno para que el código funcione. Como dijiste que funciona en Linux, incluso sin la barra que falta, me pregunto cómo es encontrar tu archivo.

Le sugiero que cree una ruta al archivo relativo al script PHP que se está ejecutando, o proporcione una ruta absoluta y no confíe en getcwd() que probablemente no devuelva lo que esperaba.El valor de getcwd() puede ser impredecible en todos los sistemas y no es muy portátil.

Por ejemplo, si el archivo que está intentando escribir un mensaje reside en la misma carpeta que el script PHP:

$post = array('image' => '@image.jpg'); es suficiente. Si es necesario, proporcionar una ruta absoluta: $post = array('image' => '@/home/youruser/yourdomain/image.jpg');

Como dijo Terence, si necesita el código para ser portable a través de Linux & de Windows, considere el uso PHP's Predefined ConstantDIRECTORY_SEPARATOR

$url = "http://yoursite.com/upload.php"; 
// images\image.jpg on Windows images/image.jpg on Linux 
$post = array('image' => '@images'.DIRECTORY_SEPARATOR.'image.jpg'); 
$this->ch = curl_init(); 
curl_setopt($this->ch, CURLOPT_URL, $url); 
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($this->ch, CURLOPT_TIMEOUT, 30); 
curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt($this->ch, CURLOPT_POST, 1); 
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post); 
$body = curl_exec($this->ch); 
var_dump($body); 

getcwd()cURL

1

si se trabaja con xampp Asegúrese de que en el archivo de configuración de php.ini

Número de línea 952 es sin comentar es decir si la línea es

;extension=php_curl.dll 

continuación, hacer que

extension=php_curl.dll 
+0

El rizo está funcionando pero hubo un error, el error diferente. –

1

creo, un mejor enfoque sería:

$imgpath = implode(DIRECTORY_SEPARATOR, array(getcwd(), 'images', 'image.jpg')); 
$post = array('image'=>'@'.$imgpath); 
Cuestiones relacionadas