Задать вопрос
Infinite
@Infinite
Developer

Как правильно отправить файл с помощью curl и php?

Работаю с api стороннего сервиса, обрабатываю форму, данные с которой отправлены аяксом. Форма состоит из обычных полей и поле с файлом, при попытке отправить doc, pdf файл, как содержимое файла отправляются кракозябры и сервер возвращает 400 ошибку, куда копать? Думаю может быть дело в кодировке или в заголовках что-то упускаю?
Мой код
<?php
$id = filter_input(INPUT_POST, 'id' );
$first_name  = filter_input(INPUT_POST, 'first_name');
$last_name = filter_input(INPUT_POST, 'last_name');
$middle_name  = filter_input(INPUT_POST, 'middle_name');
$email = filter_input(INPUT_POST, 'email' );
$phone = filter_input(INPUT_POST, 'phone' );

$applicant = array(
        'r_id'=> (int)$id,
        'first_name' =>  $first_name,
        'last_name' =>  $last_name,
        'middle_name' =>  $middle_name,
        'email' => $email,
        'phone' => $phone,
        'source_type' =>    'applied',
    );

$fields = array('applicant' => $applicant);

// URL to upload to
$url = "https://site.io/api/v2/orders";
$token = "f";
// curl
$curl = curl_init();

$boundary = uniqid();
$delimiter = '-------------' . $boundary;

$post_data = build_data_files($boundary, $fields);

// print_r($post_data);

curl_setopt_array($curl, array(
  CURLOPT_URL => $url,
  CURLOPT_RETURNTRANSFER => 1,
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POST => 1,
  CURLOPT_POSTFIELDS => $post_data,
  CURLINFO_HEADER_OUT => true,
  CURLOPT_HTTPHEADER => array(
    "Authorization: Bearer $token",
    "Content-Type: multipart/form-data; charset=utf-8; boundary=" . $delimiter,
    "Content-Length: " . strlen($post_data)
  ),
));

$response = curl_exec($curl);

$info = curl_getinfo($curl);
echo "code: ${info['http_code']}";

print_r($info['request_header']);

var_dump($response);
$err = curl_error($curl);

echo "error";
var_dump($err);
curl_close($curl);

function build_data_files($boundary, $fields){
    $data = '';
    $eol = "\r\n";

    $delimiter = '-------------' . $boundary;

    foreach ($fields['applicant'] as $name => $content) {
        $data .= "--" . $delimiter . $eol           
            . 'Content-Disposition: form-data; name="applicant[' . $name . "]\"".$eol.$eol
            . $content . $eol;
    }    
    // Добавление файла
        $content = file_get_contents($_FILES["cv"]["tmp_name"]);
        echo $content;
        $data .= "--" . $delimiter . $eol
            . 'Content-Disposition: form-data; name="applicant[cv]"; filename="' . $_FILES["cv"]["name"] . '"' . $eol
            . 'Content-Type: '. $_FILES["cv"]["type"] .$eol
            . 'Content-Transfer-Encoding: base64'.$eol
            ;
        $data .= $eol;
        $data .= $content . $eol;
    // Добавление файла
    $data .= "--" . $delimiter . "--".$eol;
    return $data;
}

  • Вопрос задан
  • 199 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@krypt3r
Для загрузки файлов необходимо использовать интерфейс CURLFile.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы