Chunk upload for GDrive

Instead of storing the WHOLE file in memory in a PHP variable, use the
library's chunk upload support.
This commit is contained in:
Vincent Petry 2016-03-16 17:57:54 +01:00
parent 00ef623f1c
commit 8e0b78c746
1 changed files with 39 additions and 6 deletions

View File

@ -490,18 +490,15 @@ class Google extends \OC\Files\Storage\Common {
$path = self::$tempFiles[$tmpFile];
$parentFolder = $this->getDriveFile(dirname($path));
if ($parentFolder) {
// TODO Research resumable upload
$mimetype = \OC::$server->getMimeTypeDetector()->detect($tmpFile);
$data = file_get_contents($tmpFile);
$params = array(
'data' => $data,
'mimeType' => $mimetype,
'uploadType' => 'media'
);
$result = false;
if ($this->file_exists($path)) {
$file = $this->getDriveFile($path);
$result = $this->service->files->update($file->getId(), $file, $params);
$this->client->setDefer(true);
$request = $this->service->files->update($file->getId(), $file, $params);
} else {
$file = new \Google_Service_Drive_DriveFile();
$file->setTitle(basename($path));
@ -509,8 +506,44 @@ class Google extends \OC\Files\Storage\Common {
$parent = new \Google_Service_Drive_ParentReference();
$parent->setId($parentFolder->getId());
$file->setParents(array($parent));
$result = $this->service->files->insert($file, $params);
$this->client->setDefer(true);
$request = $this->service->files->insert($file, $params);
}
$chunkSizeBytes = 10 * 1024 * 1024;
// Create a media file upload to represent our upload process.
$media = new \Google_Http_MediaFileUpload(
$this->client,
$request,
'text/plain',
null,
true,
$chunkSizeBytes
);
$media->setFileSize(filesize($tmpFile));
// Upload the various chunks. $status will be false until the process is
// complete.
$status = false;
$handle = fopen($tmpFile, 'rb');
while (!$status && !feof($handle)) {
$chunk = fread($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
}
// The final value of $status will be the data from the API for the object
// that has been uploaded.
$result = false;
if ($status !== false) {
$result = $status;
}
fclose($handle);
// Reset to the client to execute requests immediately in the future.
$this->client->setDefer(false);
if ($result) {
$this->setDriveFile($path, $result);
}