繁体   English   中英

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

[英]DropBox API application/octet-stream header

我试图使用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 -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

这是我的代码:

$uploads = wp_upload_dir();
$file = $uploads['basedir']."/maintainme/backups/files/backup_".$filename.'/'.$filename.'.zip';
$ch = curl_init();
$url = 'https://content.dropboxapi.com/2/files/upload_session/start';
$headers = array(
    'Authorization: Bearer ' .$dropbox_token,
    'Dropbox-API-Arg: {\"close\": false}',
    'Content-Type: application/octet-stream',
);
$fields = array('file' => '@' . $file);
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, $fields ); 
curl_setopt($ch, CURLOPT_VERBOSE, 1);
$result = curl_exec($ch);
curl_close($ch);

我收到的错误消息是:

调用API函数“文件/上传会话/启动”时出错:错误的HTTP“内容类型”标头:“应用程序/八位字节流;边界= ------------------ ------ 1ee7d00b0e9b0c47" 。 期望“应用程序/八位字节流”,“文本/纯文本; charset = dropbox-cors-hack”之一。

似乎每次我尝试发出此“ Boundary = ------------ blahblahblah”都会附加到我的内容类型标头中。 有人有想法么??? 谢谢!

解决了! 我一时兴起,检查了位于http://php.net/manual/en/function.curl-setopt.php的'CURLOPT_POSTFIELDS'选项,它的意思是:

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

上段中相关部分用黑体显示。 显然,将数组传递给CURLOPT_POSTFIELDS选项是在内容类型后面附加'Boundary = ---- blahblahblah'并导致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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM