我正在尝试使用PHP cURL将文件上传到Rest API(Tableau Server Rest API)端点。
file upload procedure存在三个步骤:
我遇到服务器问题,在第二步给我一个500状态代码。在联系支持后,我们发现问题很可能是curl请求似乎使用-data
标志而不是--data-binary
标志,这意味着在请求主体上发生了某种编码,应该不正在发生。这会导致服务器使用500状态代码而不是实际错误消息进行响应...
我想知道如何在PHP中使用--data-binary
标志发出cURL请求。
我当前代码的相关部分:
// 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
是“PUT”,$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
与content-type标题中的boundary-string相同。
我知道这是一种有点/非常混乱的方式来构建我的身体,我打算一旦我可以上传我的文件就使用Mustache:S
(我想提一下,这是我在这里的第一篇文章,请温柔......)
答案 0 :(得分:1)
CURLOPT_POSTFIELDS可以接受key = value字段对的数组。不要建立自己的哑剧身体。
这就是你应该拥有的一切,真的:
$data = array(
'tableau_file' => '@/path/to/file';
^---tell curl this field is a file
etc..
);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);