diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml
index ae999a03465a4..7e904cfc342e7 100644
--- a/apps/files/appinfo/info.xml
+++ b/apps/files/appinfo/info.xml
@@ -10,7 +10,7 @@
Files
File Management
File Management
- 2.3.0
+ 2.3.1
agpl
John Molakvoæ
Robin Appelman
@@ -35,6 +35,12 @@
OCA\Files\BackgroundJob\DeleteExpiredOpenLocalEditor
+
+
+ OCA\Files\Migration\ChunkedUploadConfigRepairStep
+
+
+
OCA\Files\Command\Scan
OCA\Files\Command\DeleteOrphanedFiles
diff --git a/apps/files/composer/composer/autoload_classmap.php b/apps/files/composer/composer/autoload_classmap.php
index 68cdabb3dcdab..500333c4f518d 100644
--- a/apps/files/composer/composer/autoload_classmap.php
+++ b/apps/files/composer/composer/autoload_classmap.php
@@ -65,11 +65,13 @@
'OCA\\Files\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php',
'OCA\\Files\\Listener\\RenderReferenceEventListener' => $baseDir . '/../lib/Listener/RenderReferenceEventListener.php',
'OCA\\Files\\Listener\\SyncLivePhotosListener' => $baseDir . '/../lib/Listener/SyncLivePhotosListener.php',
+ 'OCA\\Files\\Migration\\ChunkedUploadConfigRepairStep' => $baseDir . '/../lib/Migration/ChunkedUploadConfigRepairStep.php',
'OCA\\Files\\Migration\\Version11301Date20191205150729' => $baseDir . '/../lib/Migration/Version11301Date20191205150729.php',
'OCA\\Files\\Migration\\Version12101Date20221011153334' => $baseDir . '/../lib/Migration/Version12101Date20221011153334.php',
'OCA\\Files\\Notification\\Notifier' => $baseDir . '/../lib/Notification/Notifier.php',
'OCA\\Files\\ResponseDefinitions' => $baseDir . '/../lib/ResponseDefinitions.php',
'OCA\\Files\\Search\\FilesSearchProvider' => $baseDir . '/../lib/Search/FilesSearchProvider.php',
+ 'OCA\\Files\\Service\\ChunkedUploadConfig' => $baseDir . '/../lib/Service/ChunkedUploadConfig.php',
'OCA\\Files\\Service\\DirectEditingService' => $baseDir . '/../lib/Service/DirectEditingService.php',
'OCA\\Files\\Service\\LivePhotosService' => $baseDir . '/../lib/Service/LivePhotosService.php',
'OCA\\Files\\Service\\OwnershipTransferService' => $baseDir . '/../lib/Service/OwnershipTransferService.php',
diff --git a/apps/files/composer/composer/autoload_static.php b/apps/files/composer/composer/autoload_static.php
index ca88e773e4aa5..488680d47e01f 100644
--- a/apps/files/composer/composer/autoload_static.php
+++ b/apps/files/composer/composer/autoload_static.php
@@ -80,11 +80,13 @@ class ComposerStaticInitFiles
'OCA\\Files\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php',
'OCA\\Files\\Listener\\RenderReferenceEventListener' => __DIR__ . '/..' . '/../lib/Listener/RenderReferenceEventListener.php',
'OCA\\Files\\Listener\\SyncLivePhotosListener' => __DIR__ . '/..' . '/../lib/Listener/SyncLivePhotosListener.php',
+ 'OCA\\Files\\Migration\\ChunkedUploadConfigRepairStep' => __DIR__ . '/..' . '/../lib/Migration/ChunkedUploadConfigRepairStep.php',
'OCA\\Files\\Migration\\Version11301Date20191205150729' => __DIR__ . '/..' . '/../lib/Migration/Version11301Date20191205150729.php',
'OCA\\Files\\Migration\\Version12101Date20221011153334' => __DIR__ . '/..' . '/../lib/Migration/Version12101Date20221011153334.php',
'OCA\\Files\\Notification\\Notifier' => __DIR__ . '/..' . '/../lib/Notification/Notifier.php',
'OCA\\Files\\ResponseDefinitions' => __DIR__ . '/..' . '/../lib/ResponseDefinitions.php',
'OCA\\Files\\Search\\FilesSearchProvider' => __DIR__ . '/..' . '/../lib/Search/FilesSearchProvider.php',
+ 'OCA\\Files\\Service\\ChunkedUploadConfig' => __DIR__ . '/..' . '/../lib/Service/ChunkedUploadConfig.php',
'OCA\\Files\\Service\\DirectEditingService' => __DIR__ . '/..' . '/../lib/Service/DirectEditingService.php',
'OCA\\Files\\Service\\LivePhotosService' => __DIR__ . '/..' . '/../lib/Service/LivePhotosService.php',
'OCA\\Files\\Service\\OwnershipTransferService' => __DIR__ . '/..' . '/../lib/Service/OwnershipTransferService.php',
diff --git a/apps/files/lib/App.php b/apps/files/lib/App.php
index c8d2b786cd604..b6b0ffa6917f6 100644
--- a/apps/files/lib/App.php
+++ b/apps/files/lib/App.php
@@ -8,6 +8,7 @@
namespace OCA\Files;
use OC\NavigationManager;
+use OCA\Files\Service\ChunkedUploadConfig;
use OCP\App\IAppManager;
use OCP\IConfig;
use OCP\IGroupManager;
@@ -44,9 +45,8 @@ public static function getNavigationManager(): INavigationManager {
public static function extendJsConfig($settings): void {
$appConfig = json_decode($settings['array']['oc_appconfig'], true);
- $maxChunkSize = (int)Server::get(IConfig::class)->getAppValue('files', 'max_chunk_size', (string)(100 * 1024 * 1024));
$appConfig['files'] = [
- 'max_chunk_size' => $maxChunkSize
+ 'max_chunk_size' => ChunkedUploadConfig::getMaxChunkSize(),
];
$settings['array']['oc_appconfig'] = json_encode($appConfig);
diff --git a/apps/files/lib/Capabilities.php b/apps/files/lib/Capabilities.php
index fdbbdf63f22b1..d20d348a9f5df 100644
--- a/apps/files/lib/Capabilities.php
+++ b/apps/files/lib/Capabilities.php
@@ -8,6 +8,7 @@
namespace OCA\Files;
use OC\Files\FilenameValidator;
+use OCA\Files\Service\ChunkedUploadConfig;
use OCP\Capabilities\ICapability;
class Capabilities implements ICapability {
@@ -20,7 +21,7 @@ public function __construct(
/**
* Return this classes capabilities
*
- * @return array{files: array{'$comment': ?string, bigfilechunking: bool, blacklisted_files: array, forbidden_filenames: list, forbidden_filename_basenames: list, forbidden_filename_characters: list, forbidden_filename_extensions: list}}
+ * @return array{files: array{'$comment': ?string, bigfilechunking: bool, blacklisted_files: array, forbidden_filenames: list, forbidden_filename_basenames: list, forbidden_filename_characters: list, forbidden_filename_extensions: list, chunked_upload: array{max_size: int, max_parallel_count: int}}}
*/
public function getCapabilities(): array {
return [
@@ -33,6 +34,10 @@ public function getCapabilities(): array {
'forbidden_filename_extensions' => $this->filenameValidator->getForbiddenExtensions(),
'bigfilechunking' => true,
+ 'chunked_upload' => [
+ 'max_size' => ChunkedUploadConfig::getMaxChunkSize(),
+ 'max_parallel_count' => ChunkedUploadConfig::getMaxParallelCount(),
+ ],
],
];
}
diff --git a/apps/files/lib/Migration/ChunkedUploadConfigRepairStep.php b/apps/files/lib/Migration/ChunkedUploadConfigRepairStep.php
new file mode 100644
index 0000000000000..ee7a63908ef69
--- /dev/null
+++ b/apps/files/lib/Migration/ChunkedUploadConfigRepairStep.php
@@ -0,0 +1,26 @@
+getAppValue('files', 'max_chunk_size');
+ if ($maxChunkSize === '') {
+ // Skip if no value was configured before
+ return;
+ }
+
+ ChunkedUploadConfig::setMaxChunkSize((int)$maxChunkSize);
+ Server::get(IConfig::class)->deleteAppValue('files', 'max_chunk_size');
+ }
+}
diff --git a/apps/files/lib/Service/ChunkedUploadConfig.php b/apps/files/lib/Service/ChunkedUploadConfig.php
new file mode 100644
index 0000000000000..29661750f8b07
--- /dev/null
+++ b/apps/files/lib/Service/ChunkedUploadConfig.php
@@ -0,0 +1,30 @@
+getSystemValueInt(self::KEY_MAX_SIZE, 100 * 1024 * 1024);
+ }
+
+ public static function setMaxChunkSize(int $maxChunkSize): void {
+ Server::get(IConfig::class)->setSystemValue(self::KEY_MAX_SIZE, $maxChunkSize);
+ }
+
+ public static function getMaxParallelCount(): int {
+ return Server::get(IConfig::class)->getSystemValueInt(self::KEY_MAX_PARALLEL_COUNT, 5);
+ }
+}
diff --git a/apps/files/openapi.json b/apps/files/openapi.json
index 5745f07889d18..ded6ebd95e27b 100644
--- a/apps/files/openapi.json
+++ b/apps/files/openapi.json
@@ -36,6 +36,7 @@
"forbidden_filename_basenames",
"forbidden_filename_characters",
"forbidden_filename_extensions",
+ "chunked_upload",
"directEditing"
],
"properties": {
@@ -76,6 +77,23 @@
"type": "string"
}
},
+ "chunked_upload": {
+ "type": "object",
+ "required": [
+ "max_size",
+ "max_parallel_count"
+ ],
+ "properties": {
+ "max_size": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "max_parallel_count": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ },
"directEditing": {
"type": "object",
"required": [
diff --git a/config/config.sample.php b/config/config.sample.php
index 709c1fb73c63a..c8ee3c301aec3 100644
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -2556,4 +2556,22 @@
'/bin',
'/opt/bin',
],
+
+/**
+ * The maximum chunk size to use for chunked uploads.
+ * A bigger chunk size results in higher throughput, but above 100 MiB there are only diminishing returns,
+ * while services like Cloudflare already limit to 100 MiB.
+ *
+ * Defaults to 100 MiB.
+ */
+'files.chunked_upload.max_size' => 100 * 1024 * 1024,
+
+/**
+ * The maximum number of chunks uploaded in parallel during chunked uploads.
+ * A bigger count results in higher throughput, but will also consume more server workers,
+ * while the improvements diminish.
+ *
+ * Defaults to 5.
+ */
+'files.chunked_upload.max_parallel_count' => 5,
];