Dropbox v2 API - 大文件上传
Dropbox v2 API - large file uploads
这个问题是我 关于同一主题的问题。简单的文件上传,好吧,简单。
$headers = array("Authorization: Bearer dropbox_token",
'Content-Type: application/octet-stream',
'Dropbox-API-Arg: {"path":"/path/file.ext",
"mode":"add"}');
$data = "I love Whosebug";
$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 returns 消息
Error in call to API function "files/upload": Bad HTTP "Content-Type" header: "application/octet-stream; boundary=--... Expecting one of "application/octet-stream", "text/plain; charset=dropbox-cors-hack
如果有人能告诉我哪里可能出了问题,我将不胜感激。
看起来 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
不支持)。
如果有人对 CURLOPT_INFILE
无法正常工作的 Dropbox API v2 的快速修复感兴趣,请转到此 link Dropbox PHP v2 upload issue
Greg 解释并建议使用此代码 curl_setopt($ch, CURLOPT_POSTFIELDS, fread($fp, $filesize))
而不是 curl_setopt($ch, CURLOPT_INFILE, $fp);
这个问题是我
$headers = array("Authorization: Bearer dropbox_token",
'Content-Type: application/octet-stream',
'Dropbox-API-Arg: {"path":"/path/file.ext",
"mode":"add"}');
$data = "I love Whosebug";
$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 returns 消息
Error in call to API function "files/upload": Bad HTTP "Content-Type" header: "application/octet-stream; boundary=--... Expecting one of "application/octet-stream", "text/plain; charset=dropbox-cors-hack
如果有人能告诉我哪里可能出了问题,我将不胜感激。
看起来 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
不支持)。
如果有人对 CURLOPT_INFILE
无法正常工作的 Dropbox API v2 的快速修复感兴趣,请转到此 link Dropbox PHP v2 upload issue
Greg 解释并建议使用此代码 curl_setopt($ch, CURLOPT_POSTFIELDS, fread($fp, $filesize))
而不是 curl_setopt($ch, CURLOPT_INFILE, $fp);