Может быть кто-то сталкивался с такой задачей: нужно отправить файл с формы(на стороннем сайте) на Битрикс24 Диск(хранилище). Суть такова: получив вебхук на битрикс24 я с помощью метода(disk.storage.getlist) по rest api возвращаю список всех хранилищ(нужен ID хранилища). Далее с помощью метода(disk.storage.getchildren) и получившего ранее ID возвращаю список файлов и папок в хранилища(беру отсюда ID папки, в которую собираюсь отправлять файл). Следующий шаг, метод(disk.folder.uploadfile) и ID папки мне возвращают массив вида
"result": {
"field": "file",
"uploadUrl": "url, куда грузить файл"
}
"На полученный UploadUrl посылаем POST-запрос в multipart/form-data, в котором передаем файл в поле с именем, полученном в параметре field:"(из документации). Собственно мой cUrl:
$name = $_FILES['file-upload']['name'];
$path = $_FILES['file-upload']['tmp_name'];
$type = $_FILES['file-upload']['type'];
$size = $_FILES['file-upload']['size'];
//указываем, куда мы хотим загрузить фаил(на сервере)
$upload_dir = "../upload/resume/" . $name;
//data
$fields = array(
'name' => $name,
'file' => base64_encode(file_get_contents($upload_dir)),
);
//заголовки
$headers = array(
"Content-Type: multipart/form-data",
);
//начало сеанса curl
$curl_post = curl_init();
curl_setopt($curl_post, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_post, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl_post, CURLOPT_URL, $url_for_post); // url на который нужно отправлять фаил
curl_setopt($curl_post, CURLOPT_HEADER, 0);
curl_setopt($curl_post, CURLOPT_HTTPHEADER, $headers); //заголовки
curl_setopt($curl_post, CURLOPT_POSTFIELDS, $fields); //отправляемые данные
curl_setopt($curl_post, CURLOPT_POST, 1);
$res = curl_exec($curl_post);
curl_close($curl_post);
//конец сеанса curl
echo '<pre>';
print_r($res);
print_r(json_decode($res, true));
echo '</pre>';
В итоге мне возвращается ошибка такого вида:
(
[error] => DISK_BASE_SERVICE_22001
[error_description] => Error: required parameter file (DISK_BASE_SERVICE_22001).
)
На зарубежном stackoverflow нашел строчку с таким кодом(свои данные я подставил):
exec("curl -X POST -F 'file=@" . $upload_dir . "' '" . $url_for_post . "'");
И о господи - она сработала...
Прошу помощи, скорее всего я не правильно составляю curl. Может у того, кто сталкивался есть другие идеи. PS: по поводу base64_encode() - "Методы REST-сервиса получают файлы в виде строки, закодированной в base64" это из документации. но я пробовал и без base64_encode(). Заранее спасибо!
UPD(6.09.2019) Решение нашел. может быть кому пригодится($fields заменил на $data_post; $url_for_post заменил на $urlOfUpload)
$name = $_FILES['file-upload']['name'];
$path = $_FILES['file-upload']['tmp_name'];
$type = $_FILES['file-upload']['type'];
$size = $_FILES['file-upload']['size'];
$data_post = [
'file' => curl_file_create($path, $type, $name),
];
//Начало сеанса curl
$curlPost = curl_init();
curl_setopt($curlPost, CURLOPT_POST, 1);
curl_setopt($curlPost, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlPost, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curlPost, CURLOPT_URL, $urlOfUpload); // url на который нужно отправлять фаил
curl_setopt($curlPost, CURLOPT_HEADER, 0);
curl_setopt($curlPost, CURLOPT_POSTFIELDS, $data_post);
$resultCurlPost = curl_exec($curlPost);
curl_close($curlPost);
//Конец сеанса curl
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть реализация фабричного метода:
Разрабатываю RESTful API на фреймворке Yii2На данный момент делаю вторую версию API v2