summaryrefslogtreecommitdiffstats
path: root/apps/files_external
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2016-03-16 17:57:54 +0100
committerVincent Petry <pvince81@owncloud.com>2016-03-16 17:57:54 +0100
commitaa2674e7e24fc49ba57de067afce8ad97f0760f5 (patch)
tree66a4a8ffa79e34f5816b3af02cd203721064ad3c /apps/files_external
parent2f5b929ee9bccc381455ab1034748c556c172fcc (diff)
downloadnextcloud-server-aa2674e7e24fc49ba57de067afce8ad97f0760f5.tar.gz
nextcloud-server-aa2674e7e24fc49ba57de067afce8ad97f0760f5.zip
Chunk upload for GDrive
Instead of storing the WHOLE file in memory in a PHP variable, use the library's chunk upload support.
Diffstat (limited to 'apps/files_external')
-rw-r--r--apps/files_external/lib/google.php45
1 files changed, 39 insertions, 6 deletions
diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php
index 5e5716cf438..112f7e9c57f 100644
--- a/apps/files_external/lib/google.php
+++ b/apps/files_external/lib/google.php
@@ -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);
}