2011-01-31 3 views
5

Когда я использую linux и загружаю файл на удаленный сервер с помощью этого скрипта, тогда все хорошо. Но если я использую Windows, тогда скрипт не работает. Сценарий:cURL загрузка файлов на удаленный сервер на 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 

Что я делаю неправильно?

PHP 5.3

Windows 7 - не работает, Ubuntu Linux 10.10 - работа

+0

Есть ли у вас Curl скомпилированные в вашей установке PHP на вашем сервере Windows? Покажите сообщение об ошибке. Вы можете проверить установку с помощью скрипта [phpinfo()] (http://php.net/manual/en/function.phpinfo.php). – Orbling

+0

Ошибка не показана. (error_reporting = on) – Dador

+0

getcwd() не возвращается с косой чертой на конце, поэтому мне не хватает этого, кроме того, что вы не должны использовать обратную косую черту на окнах вместо forwardlash? –

ответ

4

Если вы используете Windows, ваш файл Сепаратор путь будет \ не стиль Linux /.

Одна очевидная вещь, чтобы попытаться это

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

И посмотреть, если это работает.

Если вы хотите, чтобы ваш скрипт портативный поэтому он будет работать на с ОС Windows или Linux, вы можете использовать PHP's predefined constantDIRECTORY_SEPARATOR

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

Хороший ответ. получить что-то новое. –

4

Теоретически, ваш код не должен работать (я имею в виду загрузить) в любом, Unix или окна. Рассмотрим эту часть из вашего кода:

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

В окнах getcwd() возвращает F:\Work\temp
В Linux возвращает /root/work/temp

Итак, ваш приведенный выше код будет компилироваться, как показано ниже:

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

Поскольку вы упомянули, что это сработало для вас в Linux, это означает, что /root/work/tempimages/image.jpg как-то существовал в вашей файловой системе.

Мой PHP версия:
Linux: PHP 5.1.6
Окна: PHP 5.3.2

+1

Да, это можно наблюдать. хороший ответ. –

1

Вы должны попробовать var_dump($body), чтобы увидеть, что $body действительно содержит. Когда вы сконфигурировали cURL, $body будет содержать либо ответ сервера, либо false при ошибке. Невозможно различать пустой ответ или ложь с echo. Возможно, запрос проходит очень хорошо, и сервер просто ничего не возвращает.

Однако, как говорили другие, ваш путь к файлу кажется недействительным. getcwd() не выводит окончательный /, и вам нужно будет добавить его, чтобы код работал. Поскольку вы сказали, что это работает на Linux, даже без недостающей косой черты, мне интересно, как это найти ваш файл.

Я предлагаю вам создать путь к файлу относительно запущенного скрипта PHP или предоставить абсолютный путь и не полагаться на getcwd(), который, вероятно, не вернет то, что вы ожидаете.Значение getcwd() может быть непредсказуемым в разных системах и не очень переносимо.

Например, если файл, который вы пытаетесь POST находится в той же папке, что и PHP скрипт:

$post = array('image' => '@image.jpg'); достаточно. В случае необходимости, обеспечить абсолютный путь: $post = array('image' => '@/home/youruser/yourdomain/image.jpg');

Как сказал Теренс, если вам нужен код, чтобы быть переносимыми в Linux & Windows, рассмотрите использование 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

при работе с xampp Убедитесь, что в файле конфигурации php.ini

Номер строки 952 является раскомментирована т.е. если линия

;extension=php_curl.dll 

затем сделать его

extension=php_curl.dll 
+0

Curl работает, но произошла ошибка с другой ошибкой. –

1

Я думаю, лучший подход был бы:

$imgpath = implode(DIRECTORY_SEPARATOR, array(getcwd(), 'images', 'image.jpg')); 
$post = array('image'=>'@'.$imgpath); 
Смежные вопросы