Я пытаюсь загрузить файл в конечную точку Rest API (Tableau Server Rest API), используя PHP cURL.
процедура загрузки файла существует три этапа:
У меня были проблемы с сервером, давшим мне код состояния 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
(Я хотел бы отметить, что это мой первый пост здесь, пожалуйста, будьте осторожны …)
CURLOPT_POSTFIELDS может принимать массив пар полей ключ = значение. НЕ создавайте свое собственное тело пантомимы.
Это все, что вы должны иметь, на самом деле:
$data = array(
'tableau_file' => '@/path/to/file';
^---tell curl this field is a file
etc..
);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);
Я закончил тем, что пытался реализовать «—data-binary», используя exec
функция в PHP. Прежде чем я смог перейти к этому, мне пришлось очистить некоторые из моего кода строения тела запроса. Эта очистка включала в себя переход от строительства строки ($body .= "this" . $that . "\n";
) к шаблонному движку (Усы). Каким-то образом это изменение решило проблему.