我正在尝试创建一个远程上传系统,该系统将从任何给定链接将文件上传到Google驱动器。部分有效。现在,当我提供来自cloud storage provider like Google
的下载链接作为输入时,在完成92-99%的上传过程后,它失败了。远程文件不再可读。并非链接已过期或Google抛出任何错误。运行脚本的服务器上的错误日志为空。
我正在使用的代码:
if ($_SERVER['REQUEST_METHOD'] == 'POST' && $client->getAccessToken()) {
$remote = $_POST['REMOTE_DL_LINK']; //Eg. https://docs-.....google...
$file = new Google_Service_Drive_DriveFile();
$file->name = "Big File";
$chunkSizeBytes = 1 * 1024 * 1024;
$client->setDefer(true);
$request = $service->files->create($file);
$media = new Google_Http_MediaFileUpload(
$client,
$request,
'text/plain',
null,
true,
$chunkSizeBytes
);
$media->setFileSize(filesize($remote));
// Upload the various chunks. $status will be false until the process is
// complete.
$status = false;
$handle = fopen($remote , "rb");
while (!$status && !feof($handle)) {
$chunk = readVideoChunk($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
}
$result = false;
if ($status != false) {
$result = $status;
}
fclose($handle);
}
function readVideoChunk ($handle, $chunkSize)
{
$byteCount = 0;
$giantChunk = "";
while (!feof($handle)) {
// fread will never return more than 8192 bytes if the stream is read buffered and it does not represent a plain file
$chunk = fread($handle, 8192);
$byteCount += strlen($chunk);
$giantChunk .= $chunk;
if ($byteCount >= $chunkSize)
{
return $giantChunk;
}
}
return $giantChunk;
}
?>
预期:上传完整文件并返回结果对象
当前结果:在false
中返回$result
现在,如果我使用来自letsupload.co之类的服务的下载链接,则没有任何错误。操作成功。
使用Google云端硬盘链接时,上传停留在92-99%。
Google链接有什么问题?
为什么有时读取失败?
除了fread()
以外,还有其他选择吗?我尝试使用guzzle http客户端,但很快意识到它创建了太多的TCP连接