【问题标题】:Dropbox v2 API - large file uploadsDropbox v2 API - 大文件上传
【发布时间】:2016-03-13 17:50:03
【问题描述】:

这个问题来自我的previous question 关于同一主题。简单的文件上传,嗯,简单

 $headers = array("Authorization: Bearer dropbox_token",
                  'Content-Type: application/octet-stream',
                'Dropbox-API-Arg: {"path":"/path/file.ext",
                "mode":"add"}');

 $data = "I love Stackoverflow";
 $ch = curl_init('https://content.dropboxapi.com/2/files/upload/');
 curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);

 curl_setopt($ch,CURLOPT_POST,true);
 curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
 curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
 $response = curl_exec($ch);
 curl_close($ch);
 echo $response;

但是,当要保存的文件数据达到 10 兆字节时,这不是一个可行的选择。我以为我会简单地使用新的(ish)PHP curl_file_create

$headers = array("Authorization: Bearer Dropbox token",
              'Content-Type: application/octet-stream',
              'Dropbox-API-Arg: {"path":"/path/bigfile.txt",
                                 "mode":"add"}');

$ch = curl_init('https://content.dropboxapi.com/2/files/upload/');
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
$args['file'] = curl_file_create('/path/to/bigfile.txt');

curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$args);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

但是,这不起作用。 Dropbox API 返回消息

调用 API 函数“files/upload”时出错:HTTP“Content-Type”标头错误:“application/octet-stream;boundary=--... 应为“application/octet-stream”之一,“文本/纯文本; charset=dropbox-cors-hack

如果有人能告诉我我可能在哪里出错,我将不胜感激。

【问题讨论】:

  • @arkascha - 一个完全没有意义的评论,对当前的讨论没有任何价值

标签: php curl dropbox-api


【解决方案1】:

看起来curl_file_create 将文件编码为多部分表单上传,这不是您与 Dropbox API 交谈时想要的。

如果我理解正确,您要解决的问题是您不想将整个文件内容加载到内存中。对吗?

如果是这样,请尝试以下方法。 (抱歉,我根本没有测试过,所以它可能包含错误。)

$headers = array('Authorization: Bearer Dropbox token',
                 'Content-Type: application/octet-stream',
                 'Dropbox-API-Arg: {"path":"/path/bigfile.txt",
                                    "mode":"add"}');

$ch = curl_init('https://content.dropboxapi.com/2/files/upload');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);

$path = '/path/to/bigfile.txt';
$fp = fopen($path, 'rb');
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($path));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

curl_close($ch);
fclose($fp);

echo $response;

请注意,如果您要上传大文件,您可能还需要考虑/files/upload_session_start, etc.。这让您可以分块上传,并且它支持大于 150MB 的文件(/files/upload 不支持)。

【讨论】:

  • 非常感谢。您的代码可以解决问题。我对其进行了一些编辑以修复一些小错误。
  • @DroidOS 感谢您修复它!
  • 非常感谢! $fp = fopen($path, 'rb'), 为我做的
  • 嗨@DroidOS它总是上传0字节。有什么想法吗?
【解决方案2】:

如果有人对 CURLOPT_INFILE 不起作用的 Dropbox API v2 的快速修复感兴趣,请转到此链接 Dropbox PHP v2 upload issue

Greg 解释并建议使用此代码curl_setopt($ch, CURLOPT_POSTFIELDS, fread($fp, $filesize)) 而不是curl_setopt($ch, CURLOPT_INFILE, $fp);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多