PHP cURL上传文件而不处理

时间:2015-08-14 19:55:55

标签: php rest curl file-upload tableau-server

我正在尝试使用PHP cURL将文件上传到Rest API(Tableau Server Rest API)端点。

file upload procedure存在三个步骤:

  1. 启动文件上传(请求上传令牌)
  2. 附加文件上传(上传文件数据)
  3. 发布资源(保存文件)
  4. 我遇到服务器问题,在第二步给我一个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

    (我想提一下,这是我在这里的第一篇文章,请温柔......)

1 个答案:

答案 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);