You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用PHP从Dropbox下载文件到服务器失败,请求排查代码问题

问题:PHP调用Dropbox API下载文件后,生成的PDF无法打开并显示错误提示

我尝试使用PHP从Dropbox获取文件并保存到服务器,但目前未能成功。代码能生成正确名称的文件,但打开该文件时会出现以下错误提示:

Something went wrong. Don't worry, your files are still safe and the Dropboxers have been notified. Check out our Help Center and forums for help, or head back to home.

我编写的代码如下:

$file = fopen('factura-17891.pdf', "w+");
$headers = array(
    'Authorization: Bearer <token>',
    'Dropbox-API-Arg: {"path": "factura-17891.pdf"}'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://content.dropboxapi.com/2/files/download");
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_FILE, $file);
$result = curl_exec($ch);
curl_close ($ch);
fclose($file);

请问有人能指出上述代码存在的问题,或是我遗漏了什么步骤吗?


回答

我帮你排查出几个关键问题,咱们一步步来修正:

1. 请求方法错误

Dropbox的/2/files/download接口要求使用GET请求,但你代码里设置了CURLOPT_POST, TRUE,这会直接导致请求被API拒绝,返回的错误页面被写入到了PDF文件中,所以打开时才会显示Dropbox的错误提示。

2. CURLOPT_RETURNTRANSFERCURLOPT_FILE 冲突

当你设置CURLOPT_RETURNTRANSFER = 1时,curl会把响应内容返回给变量$result,而不会写入到CURLOPT_FILE指定的文件句柄里。这两个选项不能同时生效,你需要移除CURLOPT_RETURNTRANSFER的设置。

3. Dropbox文件路径格式问题

Dropbox API要求文件路径必须以斜杠/开头(比如根目录下的文件路径是"/factura-17891.pdf"),你当前的路径没有开头的斜杠,可能会导致API找不到对应的目标文件。

修正后的代码

// 用wb模式打开文件,避免Windows环境下二进制文件被自动转换换行符导致损坏
$file = fopen('factura-17891.pdf', "wb");
if (!$file) {
    die("无法打开本地文件用于写入");
}

$headers = array(
    'Authorization: Bearer <token>',
    'Dropbox-API-Arg: {"path": "/factura-17891.pdf"}' // 修正路径,添加开头斜杠
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://content.dropboxapi.com/2/files/download");
// 移除CURLOPT_POST,默认就是GET请求
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_FILE, $file);

// 可选:如果服务器SSL证书验证有问题,可临时开启(生产环境建议关闭)
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$result = curl_exec($ch);

// 添加错误调试逻辑,方便排查问题
if(curl_errno($ch)){
    echo 'CURL错误: ' . curl_error($ch);
    // 删除生成的无效文件
    fclose($file);
    unlink('factura-17891.pdf');
} else {
    fclose($file);
    echo "文件下载成功";
}

curl_close ($ch);

额外提示

  • 确保你的访问令牌<token>拥有足够的权限(至少需要files.content.read权限)。
  • 如果文件不在根目录,要填写完整的路径,比如"/folder/subfolder/factura-17891.pdf"

内容的提问来源于stack exchange,提问作者Frank

火山引擎 最新活动