fread()在读取大部分文件后无法读取远程文件

时间:2019-05-15 10:42:46

标签: php

我正在尝试创建一个远程上传系统,该系统将从任何给定链接将文件上传到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连接

0 个答案:

没有答案