如何使用PHP Curl将大型文件上载到Onedrive
我需要上传大于4MB的文件到onedrive帐户。为此,我正在尝试使用PHP和curl。如果有人尝试过此选项,请帮助我解决此问题。$url= 从结果中获取上载URL如何使用PHP Curl将大型文件上载到Onedrive,php,api,curl,onedrive,Php,Api,Curl,Onedrive,我需要上传大于4MB的文件到onedrive帐户。为此,我正在尝试使用PHP和curl。如果有人尝试过此选项,请帮助我解决此问题。$url= 从结果中获取上载URL $graph_url = $result['uploadUrl']; $fragSize = 320 * 1024; $file = file_get_contents($filename_location); $fileSize = strlen($file); $numFragments
$graph_url = $result['uploadUrl'];
$fragSize = 320 * 1024;
$file = file_get_contents($filename_location);
$fileSize = strlen($file);
$numFragments = ceil($fileSize / $fragSize);
$bytesRemaining = $fileSize;
$i = 0;
$ch = curl_init($graph_url);
while ($i < $numFragments) {
$chunkSize = $numBytes = $fragSize;
$start = $i * $fragSize;
$end = $i * $fragSize + $chunkSize - 1;
$offset = $i * $fragSize;
if ($bytesRemaining < $chunkSize) {
$chunkSize = $numBytes = $bytesRemaining;
$end = $fileSize - 1;
}
if ($stream = fopen($filename_location, 'r')) {
// get contents using offset
$data = stream_get_contents($stream, $chunkSize, $offset);
fclose($stream);
}
$content_range = " bytes " . $start . "-" . $end . "/" . $fileSize;
$headers = array(
"Content-Length: $numBytes",
"Content-Range:$content_range"
);
curl_setopt($ch, CURLOPT_URL, $graph_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, constant('CURL_SSL_VERIFYPEER_STATUS'));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$server_output = curl_exec($ch);
$info = curl_getinfo($ch);
$bytesRemaining = $bytesRemaining - $chunkSize;
$i++;
}
当您传递最后一组数据时,它应该是正确的数据字节。否则,上载会话将失败。您的应用程序需要: 创建上载会话 将字节上载到上载会话 请参阅OneDrive开发中心的上载大型文件和上载会话文档页面:有关每个步骤的请求类型以及预期的JSON或http响应代码的详细信息 从PHP功能的角度来看,您希望: 确定上传文件大小、文件名的文件属性 通过curl发送post数据以创建上载会话参见标题为1的示例代码段的部分。 将上面的JSON响应中的uploadUrl解析为php变量 通过cURL将二进制内容发送到上面提取的uploadURL,请参阅标题为发送整个文件或部分文件块的部分-确定方法时应考虑文件大小和连接/带宽 解析响应头http响应代码并有条件地执行以下操作: 如果HTTP 416请求范围的响应代码不可满足,请使用预期的字节范围重试 如果接受发送字节范围/部分响应代码202,则继续下一个字节范围-请参阅恢复正在进行的上载 已创建HTTP 200 OK或HTTP 201的完成/返回/退出功能响应代码 在任何50倍的响应中,发送GET请求请参阅恢复正在进行的上载,以确定下一步发送什么/如何恢复 如果检测到文件名冲突,则响应代码为HTTP/1.1 409冲突: 要取消上载会话,您应获得HTTP/1.1 204 No Content的响应代码。 解决/处理名称冲突 重新启动进程
此代码适用于我:
<?php
$fileName="myfile.zip";
$filename_location=realpath($fileName);
$token="{access token}";
$ch = curl_init();
$url="https://graph.microsoft.com/v1.0/me/drive/root:/api/$fileName:/createUploadSession";
curl_setopt($ch, CURLOPT_URL,$url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
$data= '{
"item": {
"@microsoft.graph.conflictBehavior": "rename",
"description": "description",
"fileSystemInfo": { "@odata.type": "microsoft.graph.fileSystemInfo" },
"name": "'.$fileName.'"
}
}';
$header = array(
'Content-Type: application/json',
"Cache-Control: no-cache",
"Pragma: no-cache",
"Authorization: bearer $token");
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header );
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = json_decode(curl_exec($ch)) ;
$graph_url = $result->uploadUrl;
$fragSize = 320 * 1024;
$file = file_get_contents($filename_location);
$fileSize = strlen($file);
$numFragments = ceil($fileSize / $fragSize);
$bytesRemaining = $fileSize;
$i = 0;
$ch = curl_init($graph_url);
while ($i < $numFragments) {
$chunkSize = $numBytes = $fragSize;
$start = $i * $fragSize;
$end = $i * $fragSize + $chunkSize - 1;
$offset = $i * $fragSize;
if ($bytesRemaining < $chunkSize) {
$chunkSize = $numBytes = $bytesRemaining;
$end = $fileSize - 1;
}
if ($stream = fopen($filename_location, 'r')) {
// get contents using offset
$data = stream_get_contents($stream, $chunkSize, $offset);
fclose($stream);
}
$content_range = " bytes " . $start . "-" . $end . "/" . $fileSize;
$headers = array(
"Content-Length: $numBytes",
"Content-Range:$content_range"
);
curl_setopt($ch, CURLOPT_URL, $graph_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$server_output = curl_exec($ch);
$info = curl_getinfo($ch);
$bytesRemaining = $bytesRemaining - $chunkSize;
$i++;
}
?>
您没有告诉我们问题,或者没有共享任何代码???
<?php
$fileName="myfile.zip";
$filename_location=realpath($fileName);
$token="{access token}";
$ch = curl_init();
$url="https://graph.microsoft.com/v1.0/me/drive/root:/api/$fileName:/createUploadSession";
curl_setopt($ch, CURLOPT_URL,$url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
$data= '{
"item": {
"@microsoft.graph.conflictBehavior": "rename",
"description": "description",
"fileSystemInfo": { "@odata.type": "microsoft.graph.fileSystemInfo" },
"name": "'.$fileName.'"
}
}';
$header = array(
'Content-Type: application/json',
"Cache-Control: no-cache",
"Pragma: no-cache",
"Authorization: bearer $token");
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header );
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = json_decode(curl_exec($ch)) ;
$graph_url = $result->uploadUrl;
$fragSize = 320 * 1024;
$file = file_get_contents($filename_location);
$fileSize = strlen($file);
$numFragments = ceil($fileSize / $fragSize);
$bytesRemaining = $fileSize;
$i = 0;
$ch = curl_init($graph_url);
while ($i < $numFragments) {
$chunkSize = $numBytes = $fragSize;
$start = $i * $fragSize;
$end = $i * $fragSize + $chunkSize - 1;
$offset = $i * $fragSize;
if ($bytesRemaining < $chunkSize) {
$chunkSize = $numBytes = $bytesRemaining;
$end = $fileSize - 1;
}
if ($stream = fopen($filename_location, 'r')) {
// get contents using offset
$data = stream_get_contents($stream, $chunkSize, $offset);
fclose($stream);
}
$content_range = " bytes " . $start . "-" . $end . "/" . $fileSize;
$headers = array(
"Content-Length: $numBytes",
"Content-Range:$content_range"
);
curl_setopt($ch, CURLOPT_URL, $graph_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$server_output = curl_exec($ch);
$info = curl_getinfo($ch);
$bytesRemaining = $bytesRemaining - $chunkSize;
$i++;
}
?>