[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Отправка файла через Curl
patrick1111
Здравствуйте, столкнулся с очень странной проблемой, убил вечер но прогресса никакого, буду очень признателен за помощь, ну а теперь ближе к делу:

Делается запрос через Curl:

$filePath = '/srv/site/file.txt';

file_exists($filePath); // TRUE

$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'http://xxx/upload',
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_POSTFIELDS => [
'file' => '@' . $filePath
],
]);


curl_exec($ch); // Никаких ошибок не выдает, успешно приходит ответ

// curl_close и т.д. и т. п.



Но на сервере-приемнике я не получаю файла


print_r($_FILES); // Пусто
print_r($_POST); // Array('file' => '@/srv/site/file.txt')
Alchemist
версия пхп ?
patrick1111
Цитата (Alchemist @ 17.11.2014 - 14:07)
версия пхп ?

5.6.2, но не думаю что дело в версии
walerus
У меня скрипт ругается на [ ] скобки, в таком виде:
define( 'ROOT',			dirname(__FILE__) . '/' );

$filePath = ROOT . 'arial.ttf';

file_exists($filePath); // TRUE

$ch = curl_init();
curl_setopt_array($ch,
array(
CURLOPT_URL => 'http://xxx/upload',
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_POSTFIELDS => array(
'file' => '@' . $filePath
),
)
);


curl_exec($ch); // Никаких ошибок не выдает, успешно приходит ответ
все работает отлично.
Alchemist
walerus, квадратные скобки в качестве замены конструкции array() были введены в PHP 5.4. Ты видимо пользуешьсяя более ранней версией.


Цитата (patrick1111 @ 17.11.2014 - 12:13)
5.6.2, но не думаю что дело в версии

patrick1111, у меня есть классический ответ на это, но меня тут уже упрекали в заносчивости...

http://php.net/manual/en/function.curl-setopt.php

Цитата
CURLOPT_POSTFIELDS - ...Начиная с PHP 5.5.0, префикс @ является устаревшим и файлы рекомендуется отправлять используя CURLFile. Префикс @ может быть выключен, для безопасной передачи значений начинающихся с @, путем выставления CURLOPT_SAFE_UPLOAD параметра в  TRUE.

CURLOPT_SAFE_UPLOAD - ... Добавлен в PHP 5.5.0 с дефолтным значением FALSE. Начиная с PHP 5.6.0 дефолтное значение изменено на TRUE.


PS: я специально дал ссылку на английскую версию мануала, потому что в русском переводе этой инфы нет.
walerus
Alchemist Да ты прав, у меня версия 5.3.8, качаю уже новую ))
Игорь_Vasinsky
walerus
https://wiki.php.net/rfc/additional-splat-usage

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
walerus
Alchemist, Игорь_Vasinsky спасибо rolleyes.gif
patrick1111
Alchemist , спасибо большое за ответ, попробую сделать таким путем, не могу понять почему в документации нету предупреждения о таком изменении, обычно они всегда их указывают
patrick1111
Топик можно закрывать, ответ Alchemist помог


$filePath = '/srv/site/file.jpg';

file_exists($filePath); // TRUE

$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'http://xxx/upload',
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_POSTFIELDS => [
'file' => new CURLFile($filePath, 'image/jpeg', 'image0') // Вместо путей с @ в начале, используем класс CURLFile, либо функцию curl_file_create() с теми же аргументами
],
]);


curl_exec($ch); // Никаких ошибок не выдает, успешно приходит ответ

// curl_close и т.д. и т. п.



А вот пример с оф. сайта: http://php.net/manual/en/class.curlfile.php#115569
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.