当前位置: 首页 > 知识库问答 >
问题:

使用gdrive php客户端上载大型文件时出现问题

戚逸清
2023-03-14

我得到以下错误:

PHP致命错误:在vendor/Google/apiclient/src/Google/Http/REST.PHP:118中出现未捕获的异常“Google\u Service\u exception”,消息为“未能解析内容范围头”

堆栈跟踪:

0供应商/google/apiclient/src/Google/Http/REST. php(94):Google_Http_REST::decodeHttp响应(对象(GuzzleHttp\Psr7\响应),对象(GuzzleHttp\Psr7\请求), NULL)

1【内部函数】:Google_Http_REST::doExecute(Object(GuzzleHttp\Client),Object(GuzzleHttp\Psr7\Request),NULL)

2 vendor/google/apiclient/src/google/Task/Runner.php(176):调用用户函数数组(数组,数组)

3 vendor/google/apiclient/src/google/Http/REST.php(58):google_Task_Runner-run()

4供应商/谷歌/apiclient/src/谷歌/Client.php(788):Google_Http_R /var/www/html/website-redesign/application/libraries/hla_app_log/vendor/google/apiclient/src/Google/Http/REST.php在线118

上传代码

function uploadInBatch($client,$service, $parentId,$backup_file) {

$file = new Google_Service_Drive_DriveFile();
$file->title = 'backup.sql';
$file->setParents(array($parentId));
$filesize = filesize($backup_file);

$chunkSizeBytes = $filesize/20;

// Call the API with the media upload, defer so it doesn't immediately return.
$client->setDefer(true);
$request = $service->files->create($file);

// Create a media file upload to represent our upload process.
$media = new Google_Http_MediaFileUpload(
  $client,
  $request,
  'application/sql',
  null,
  true,
  $chunkSizeBytes
);
$media->setFileSize($filesize);

$status = false;
$handle = fopen($backup_file, "rb");

$chunk = fread($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
$resumeUri = $media->getResumeUri();
$offset = ftell($handle);

while (!$status) {

    if($resumeUri){
        $result = $media->resume($resumeUri);
    }
    
    fseek($handle, $offset);   
    $chunk = fread($handle, $chunkSizeBytes);
    $status = $media->nextChunk($chunk);
    if(!$status){ //nextChunk() returns 'false' whenever the upload is still in progress
        echo 'sucessfully uploaded ' . ($media->getProgress()/$filesize)*100 . ' %';
    }
    
}
fclose($handle);
// Reset to the client to execute requests immediately in the future.
$client->setDefer(false);
}

以上功能用于上传2GB左右的文件

共有1个答案

鲍建业
2023-03-14

我以前见过这个问题,它好像API不允许你上传非常大的文件。

您可以考虑遵循这里找到的示例它看起来与您的代码有点不同。

// Create a MediaFileUpload object for resumable uploads.
    $media = new Google_Http_MediaFileUpload(
        $client,
        $insertRequest,
        'video/*',
        null,
        true,
        $chunkSizeBytes
    );
    $media->setFileSize(filesize($videoPath));


    // Read the media file and upload it chunk by chunk.
    $status = false;
    $handle = fopen($videoPath, "rb");
    while (!$status && !feof($handle)) {
      $chunk = fread($handle, $chunkSizeBytes);
      $status = $media->nextChunk($chunk);
    }
 类似资料:
  • 我对由Swagger codegen生成的源代码有问题。我想上传一个带有react的文件。为此,我创建了一个Dropzone并获得了该文件的路径。如果我按照文档中的方式使用生成的客户端,它将无法工作。不幸的是,文件没有被发送。只有文件名。调试控制台也不显示已发送二进制数据。 请求未正确执行。该文件将不会上载。参数“file”只是文件名,而不是二进制数据。 大摇大摆的代码版本 openapi-gen

  • 我正在使用泽西客户端进行基于超文本传输协议的请求。如果文件很小,它会很好地工作,但当我发布大小为700M的文件时会出错: 这是我的代码:

  • 文件上载返回“状态代码8-无效参数”响应。想知道是什么导致了这种情况。 我使用Chilkat sFTP在多个合作伙伴之间传输和接收文件,没有问题,但是对于一个新的合作伙伴,我看到以下错误。合作伙伴的技术团队正在询问是否正在调用被动连接,但我在Chilkat中看不到任何可以让我改变这一点的属性。 日志消息:

  • 我使用的是Jersey 2.28,想要编写一个客户端来上传1Gb的文件,而客户端JVM堆不能超过256Mb。 我在这里有什么选择? 我试着用下面的代码片段,但结果是OOM,因为Jersey似乎一直在尽可能多地从InputStream中读取数据。为了处理大量输入,可以指示球衣进行冲洗吗?

  • 我正在开发一个必须接收excel文件的POST方法,但我有一些问题。这是我的密码 当我调用API时,在服务器端出现以下错误: 在我的web.xml中,我添加了以下代码: 我在Tomcat v7.0上运行,并添加了jersey-multipart-1.18和mimepul-1.9.3来管理Multipart数据。 我的客户端响应获得415个不受支持的媒体类型,但在我用于发送请求I的代码中,请求“Co

  • 我正在尝试通过Intellij IDEA REST客户端上传文件。我选择“文件上传(多部分/表单-数据)”并选择文件发送。这个文件的参数名是什么?在我的Sprint控制器中,我使用以下代码 我也尝试了不同的名称,比如@RequestParam的“file”、“fileTosend”、“file to send”,但是Spring总是找不到MultipartFile参数。