отправка файла с формы(на стороннем сайте) на Битрикс24 Диск(хранилище)

95
06 июля 2021, 09:50

Может быть кто-то сталкивался с такой задачей: нужно отправить файл с формы(на стороннем сайте) на Битрикс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
READ ALSO
Как избавиться от большого количества запросов к бд, при попытке вытянуть связи через expand в Yii2?

Как избавиться от большого количества запросов к бд, при попытке вытянуть связи через expand в Yii2?

Разрабатываю RESTful API на фреймворке Yii2На данный момент делаю вторую версию API v2

90
Перевод разницы во времени в часы PHP

Перевод разницы во времени в часы PHP

Как посчитать разницу $gotime - $cometime в (int) часах?

108
Работа с preg_replace

Работа с preg_replace

Прошу помочь с использованием функции preg_replace

100