2011-01-31 13 views
5

Quando uso linux e provo a caricare il file sul server remoto usando questo script, tutto va bene. Ma se uso Windows allora lo script non funziona. Script:cURL caricare file su server remoto su 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 

Che cosa sto facendo di sbagliato?

PHP 5.3

Windows 7 - non funziona, Ubuntu Linux 10.10 - lavoro

+0

Avete cURL compilati per l'installazione di PHP sul tuo server Windows? Mostra il messaggio di errore fornito. Puoi controllare l'installazione tramite uno script [phpinfo()] (http://php.net/manual/en/function.phpinfo.php). – Orbling

+0

Errore non mostrato. (error_reporting = on) – Dador

+0

getcwd() non torna con una barra alla fine, quindi mi manca quello, oltre a quello non dovresti usare una barra rovesciata su Windows invece di un forwardslash? –

risposta

4

Se si utilizza Windows, il separatore di percorso del file sarà \ non lo stile Linux /.

Una cosa ovvia da provare è

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

E vedere se funziona.

Se si desidera rendere il vostro script portatile in modo da funzionare su Windows o Linux, è possibile utilizzare PHP's predefined constantDIRECTORY_SEPARATOR

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

Risposta piacevole. ottenere qualcosa di nuovo. –

4

In teoria, il codice non dovrebbe funzionare (intendo caricare) in qualsiasi, unix o Windows. Considerate questa porzione dal codice:

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

In Windows getcwd() restituisce F:\Work\temp
In Linux Riporta /root/work/temp

Così, il vostro codice di cui sopra compilerà come di seguito:

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

Dato che hai menzionato che ha funzionato per te in linux, il che significa che /root/work/tempimages/image.jpg esisteva in qualche modo nel tuo filesystem.

La mia versione di PHP:
Linux: PHP 5.1.6
di Windows: PHP 5.3.2

+1

Sì, questo è osservabile. bella risposta. –

1

Si dovrebbe cercare var_dump($body) per vedere che cosa contiene realmente $body. Con il modo in cui hai configurato cURL, $body conterrà la risposta del server o falso, in caso di errore. Non c'è modo di distinguere tra una risposta vuota o falsa con echo. È possibile che la richiesta stia andando bene, e il server non restituisce nulla.

Tuttavia, come altri hanno già detto, il percorso del file non è valido. getcwd() non restituisce un valore finale / e sarà necessario aggiungerne uno per far funzionare il codice. Dal momento che hai detto che funziona su Linux, anche senza la barra mancante, mi chiedo come sia trovare il tuo file.

Suggerisco di creare un percorso per il file relativo allo script PHP in esecuzione o fornire un percorso assoluto e non fare affidamento su getcwd() che probabilmente non restituisce ciò che si aspetta.Il valore di getcwd() può essere imprevedibile tra i sistemi e non è molto portabile.

Ad esempio, se il file che si sta tentando di POST risiede nella stessa cartella script PHP:

$post = array('image' => '@image.jpg'); è sufficiente. Se necessario, fornire un percorso assoluto: $post = array('image' => '@/home/youruser/yourdomain/image.jpg');

Come diceva Terenzio, se è necessario il codice per essere portabile su Linux & di Windows, è possibile utilizzare 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

se si lavora con xampp Assicurarsi che nel file di configurazione php.ini

numero riga 952 è commentata cioè se la linea è

;extension=php_curl.dll 

poi ne fanno

extension=php_curl.dll 
+0

L'arricciatura funziona ma c'era un errore nel diverso errore. –

1

credo, un approccio migliore sarebbe:

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