CURL загружать файлы на удаленный сервер в MS Windows - PullRequest
5 голосов
/ 31 января 2011

Когда я использую Linux и пытаюсь загрузить файл на удаленный сервер, используя этот скрипт, тогда все хорошо.Но если я использую 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 - работает

Ответы [ 5 ]

4 голосов
/ 06 января 2014

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

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

В Windows 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
Windows: PHP 5.3.2

4 голосов
/ 06 января 2014

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

Одна очевидная вещь, которую стоит попробовать -

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

.это работает.

Если вы хотите сделать ваш скрипт переносимым, чтобы он работал на Windows или Linux, вы можете использовать предопределенную константу PHP DIRECTORY_SEPARATOR

$post=array('image'=>'@'.getcwd().'images' . DIRECTORY_SEPARATOR .'image.jpg');
1 голос
/ 12 января 2014

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

$imgpath = implode(DIRECTORY_SEPARATOR, array(getcwd(), 'images', 'image.jpg'));
$post = array('image'=>'@'.$imgpath);
1 голос
/ 11 января 2014

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

Строка № 952 без комментариев т.е. если строка

   ;extension=php_curl.dll

тогда сделай это

  extension=php_curl.dll
1 голос
/ 11 января 2014

Вы должны попробовать 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 DIRECTORY_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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...