Merge pull request #23323 from owncloud/gdrive-chunkupload

Chunk upload for GDrive
This commit is contained in:
Thomas Müller 2016-03-21 18:02:55 +01:00
commit 736b80f0cb
1 changed files with 52 additions and 5 deletions

View File

@ -490,18 +490,27 @@ 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;
$chunkSizeBytes = 10 * 1024 * 1024;
$useChunking = false;
$size = filesize($tmpFile);
if ($size > $chunkSizeBytes) {
$useChunking = true;
} else {
$params['data'] = file_get_contents($tmpFile);
}
if ($this->file_exists($path)) {
$file = $this->getDriveFile($path);
$result = $this->service->files->update($file->getId(), $file, $params);
$this->client->setDefer($useChunking);
$request = $this->service->files->update($file->getId(), $file, $params);
} else {
$file = new \Google_Service_Drive_DriveFile();
$file->setTitle(basename($path));
@ -509,8 +518,46 @@ 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($useChunking);
$request = $this->service->files->insert($file, $params);
}
if ($useChunking) {
// 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($size);
// 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);
} else {
$result = $request;
}
// Reset to the client to execute requests immediately in the future.
$this->client->setDefer(false);
if ($result) {
$this->setDriveFile($path, $result);
}