остальные — PHP cURL Загрузить файл без обработки

Я пытаюсь загрузить файл в конечную точку Rest API (Tableau Server Rest API), используя PHP cURL.

процедура загрузки файла существует три этапа:

  1. Инициировать загрузку файла (запросить токен загрузки)
  2. Добавить файл загрузки (загрузить данные файла)
  3. Опубликовать ресурс (сохранить файл)

У меня были проблемы с сервером, давшим мне код состояния 500 на втором этапе. После обращения в службу поддержки мы выяснили, что проблема, скорее всего, заключается в том, что запрос curl, кажется, использует -data флаг вместо --data-binary флаг, который означает, что некоторая кодировка происходит в теле запроса, которое должно не быть происходящим Это заставляет сервер отвечать кодом состояния 500 вместо фактического сообщения об ошибке …

Я хотел бы знать, как я могу сделать запрос cURL с --data-binary флаг в PHP.

Соответствующие разделы моего текущего кода:

// more settings
$curl_opts[CURLOPT_CUSTOMREQUEST] = $method;
$curl_opts[CURLOPT_RETURNTRANSFER] = true;
$curl_opts[CURLOPT_HTTPHEADER] = $headers;
$curl_opts[CURLOPT_POSTFIELDS] = $body;
//more settings

curl_setopt_array( $this->ch, $curl_opts );
$responseBody = curl_exec( $this->ch );

$method это «ПУТЬ», $headers содержит массив с Content-Type: multipart/mixed; boundary=boundary-string и $body построен так:

$boundary = md5(date('r', time()));

$body = "--$boundary\n";
$body .= "Content-Disposition: name='request_payload'\nContent-Type: text/xml\n\n";
$body .= "\n--$boundary\n";
$body .= "Content-Disposition: name='tableau_file'; filename='$fileName'\nContent-Type: application/octet-stream\n\n";
$body .=  file_get_contents( $path );
$body .= "\n--$boundary--";

Где $boundary совпадает со строкой границы в заголовке типа содержимого.
я знаю, что это своего рода / очень грязный способ построения моего тела, я планирую использовать Усы, как только я действительно смогу загрузить свои файлы: S

(Я хотел бы отметить, что это мой первый пост здесь, пожалуйста, будьте осторожны …)

0

Решение

CURLOPT_POSTFIELDS может принимать массив пар полей ключ = значение. НЕ создавайте свое собственное тело пантомимы.

Это все, что вы должны иметь, на самом деле:

$data = array(
'tableau_file' => '@/path/to/file';
^---tell curl this field is a file
etc..
);

curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);
1

Другие решения

Я закончил тем, что пытался реализовать «—data-binary», используя exec функция в PHP. Прежде чем я смог перейти к этому, мне пришлось очистить некоторые из моего кода строения тела запроса. Эта очистка включала в себя переход от строительства строки ($body .= "this" . $that . "\n";) к шаблонному движку (Усы). Каким-то образом это изменение решило проблему.

0

По вопросам рекламы [email protected]