DropBox API应用程序/八位字节流标题

时间:2017-05-21 23:16:05

标签: php curl http-headers dropbox content-type

我正在尝试使用PHP向Dropbox API发出cUrl请求,以便开始上传非常大的zip文件。以下是我正在尝试实施的文档,可在https://www.dropbox.com/developers/documentation/http/documentation#files-upload -

找到

网址结构:https://content.dropboxapi.com/2/files/upload_session/start

示例cUrl请求:

local capt={}
for q,w,e in my_string:gmatch("(%s*)(%S+)(%s*)") do
  if q and #q>0 then
    table.insert(capt,q)
  end
  table.insert(capt,w)
  if e and #e>0 then
    table.insert(capt,e)
  end
end

这是我的代码:

curl -X POST https://content.dropboxapi.com/2/files/upload_session/start \
    --header "Authorization: Bearer <get access token>" \
    --header "Dropbox-API-Arg: {\"close\": false}" \
    --header "Content-Type: application/octet-stream" \
    --data-binary @local_file.txt

我得到的错误信息是:

调用API函数“files / upload_session / start”时出错:错误的HTTP“Content-Type”标题:“application / octet-stream; boundary = --------------- --------- 1ee7d00b0e9b0c47" 。期待“application / octet-stream”之一,“text / plain; charset = dropbox-cors-hack”。

似乎每次我尝试发出此请求时,'Boundary = ------------ blahblahblah'都会附加到我的内容类型标题中。有人有主意吗???谢谢!

1 个答案:

答案 0 :(得分:0)

解决了!一时兴起,我检查了http://php.net/manual/en/function.curl-setopt.php处的'CURLOPT_POSTFIELDS'选项,这就是它所说的:

  

要在HTTP“POST”操作中发布的完整数据。要发布文件,请在文件前加上@并使用完整路径。可以通过使用格式为'; type = mimetype'的类型的文件名来明确指定文件类型。此参数可以作为urlencoded字符串传递,如'para1 = val1&amp; para2 = val2&amp; ...',或者作为一个数组,字段名称为键,字段数据为值。 如果value是数组,则Content-Type标头将设置为multipart / form-data 。从PHP 5.2.0开始,如果使用@前缀将文件传递给此选项,则value必须是数组。从PHP 5.5.0开始,不推荐使用@前缀,可以使用CURLFile发送文件。通过将CURLOPT_SAFE_UPLOAD选项设置为TRUE,可以禁用@前缀以安全传递以@开头的值。

相关部分在上面的段落中加粗。显然将数组传递给CURLOPT_POSTFIELDS选项是附加了'Boundary = ---- blahblahblah'的Content-Type并导致API调用失败。我改变了

curl_setopt($ch, CURLOPT_POSTFIELDS, $fields );

curl_setopt($ch, CURLOPT_POSTFIELDS, '@'.$file );

再次尝试。最初的问题已修复,但我在这段代码中遇到了“Dropbox-API-Arg”行的新问题:

$headers = array(
    'Authorization: Bearer ' .$dropbox_token,
    'Dropbox-API-Arg: {\"close\": false}',
    'Content-Type: application/octet-stream',
);

事实证明,这些参数需要正确地进行JSON编码。我用下面的代码做了这个:

$args = array('close'=>false);
$args = json_encode($args);

然后改变了

'Dropbox-API-Arg: {\"close\": false}' 

为:

'Dropbox-API-Arg:'.$args

以下是完整的最终代码:

    $uploads = wp_upload_dir();
    $file = $uploads['basedir']."/maintainme/backups/files/backup_".$filename.'/'.$filename.'.zip';
    error_log($file);

    $args = array('close'=>false);
    $args = json_encode($args);

    $ch = curl_init();
    $url = 'https://content.dropboxapi.com/2/files/upload_session/start';
    $headers = array(
        'Authorization: Bearer ' .$dropbox_token,
        'Dropbox-API-Arg:'.$args,
        'Content-Type: application/octet-stream',
    );
    $fields = array('file' => '@' . $file);
    error_log($fields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, '@'.$file ); 
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    $result = curl_exec($ch);
    error_log($result);
    curl_close($ch);