2011-01-31 11 views
5

Kiedy używam linuxa i próbuję przesłać plik na zdalny serwer za pomocą tego skryptu, wszystko jest w porządku. Ale jeśli korzystam z systemu Windows, skrypt nie działa. Scenariusz:cURL przesyłanie plików na zdalny serwer w systemie 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 

Co robię źle?

PHP 5.3

Windows 7 - nie działa, Ubuntu Linux 10.10 - praca

+0

Czy masz cURL skompilowane do instalacji PHP na twoim serwerze Windows? Pokaż wyświetlony komunikat o błędzie. Możesz sprawdzić instalację za pomocą skryptu [phpinfo()] (http://php.net/manual/en/function.phpinfo.php). – Orbling

+0

Błąd nie pokazany. (error_reporting = on) – Dador

+0

getcwd() nie powraca z ukośnikiem na końcu, więc brakuje mi tego, poza tym nie powinieneś używać odwrotnego ukośnika w oknach zamiast forwardslasha? –

Odpowiedz

4

Jeśli używasz systemu Windows, Twój separator ścieżka do pliku będzie \ nie styl Linux /.

Jedną oczywistą rzeczą jest, aby spróbować

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

i sprawdzić, czy to działa.

Jeśli chcesz, aby twój skrypt przenośny więc będzie pracować na systemie Windows lub Linux, można użyć PHP's predefined constantDIRECTORY_SEPARATOR

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

Dobra odpowiedź. zrobienie czegoś nowego. –

4

Teoretycznie Twój kod nie powinien działać (to znaczy przesłać) w dowolnej, UNIX lub Windows. Rozważmy następujący fragment z kodu:

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

W oknach getcwd() wraca F:\Work\temp
W Linuksie Zwraca /root/work/temp

Więc twój powyższy kod zostanie skompilowany jak poniżej:

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

Ponieważ wspomniałeś, że działało dla ciebie w Linuksie, co oznacza, że ​​w jakiś sposób istniał w twoim systemie plików.

Moja wersja PHP:
Linux: PHP 5.1.6
Windows: PHP 5.3.2

+1

Tak, jest to możliwe do zaobserwowania. niezła odpowiedź. –

1

Należy spróbować var_dump($body) aby zobaczyć, co naprawdę zawiera $body. Po skonfigurowaniu cURL, $body będzie zawierał odpowiedź serwera lub wartość false w przypadku niepowodzenia. Nie ma sposobu na rozróżnienie między pustą odpowiedzią lub fałszem z echo. Możliwe, że żądanie jest w porządku, a serwer po prostu nic nie zwraca.

Jednak, jak powiedzieli inni, ścieżka do pliku wydaje się nieważna. getcwd() nie wyprowadza ostatecznej wersji / i trzeba ją dodać, aby kod działał. Ponieważ powiedziałeś, że działa na Linuksie, nawet bez brakującego slasha, zastanawiam się, jak to jest znaleźć twój plik.

Proponuję utworzyć ścieżkę do pliku w odniesieniu do działającego skryptu PHP lub podać bezwzględną ścieżkę i nie polegać na getcwd(), która prawdopodobnie nie zwróci oczekiwanego.Wartość getcwd() może być nieprzewidywalna w różnych systemach i nie jest zbyt przenośna.

Na przykład, jeśli plik który próbujesz POST znajduje się w tym samym folderze co skrypt PHP:

$post = array('image' => '@image.jpg'); jest wystarczająca. W razie potrzeby zapewnić absolutną ścieżkę: $post = array('image' => '@/home/youruser/yourdomain/image.jpg');

Jak powiedział Terence, jeśli potrzebujesz kodu być przenośne całej Linux & Windows, należy rozważyć użycie 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

jeśli pracuje z xampp Upewnij się, że w pliku konfiguracyjnym php.ini jest

Numer linii 952 jest komentarzem tj jeśli linia jest

;extension=php_curl.dll 

następnie uczynić go

extension=php_curl.dll 
+0

Zwinięcie działa, ale wystąpił błąd innego błędu. –

1

myślę, że lepszym rozwiązaniem byłoby:

$imgpath = implode(DIRECTORY_SEPARATOR, array(getcwd(), 'images', 'image.jpg')); 
$post = array('image'=>'@'.$imgpath); 
Powiązane problemy