Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14359981
D12083.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
28 KB
Referenced Files
None
Subscribers
None
D12083.diff
View Options
diff --git a/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php b/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php
--- a/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php
+++ b/src/applications/config/check/PhabricatorExtraConfigSetupCheck.php
@@ -214,6 +214,9 @@
'storage.engine-selector' => pht(
'Phabricator now automatically discovers available storage engines '.
'at runtime.'),
+ 'storage.upload-size-limit' => pht(
+ 'Phabricator now supports arbitrarily large files. Consult the '.
+ 'documentation for configuration details.'),
);
return $ancient_config;
diff --git a/src/applications/config/check/PhabricatorMySQLSetupCheck.php b/src/applications/config/check/PhabricatorMySQLSetupCheck.php
--- a/src/applications/config/check/PhabricatorMySQLSetupCheck.php
+++ b/src/applications/config/check/PhabricatorMySQLSetupCheck.php
@@ -21,10 +21,13 @@
protected function executeChecks() {
$max_allowed_packet = self::loadRawConfigValue('max_allowed_packet');
- $recommended_minimum = 1024 * 1024;
+
+ // This primarily supports setting the filesize limit for MySQL to 8MB,
+ // which may produce a >16MB packet after escaping.
+ $recommended_minimum = (32 * 1024 * 1024);
if ($max_allowed_packet < $recommended_minimum) {
$message = pht(
- "MySQL is configured with a very small 'max_allowed_packet' (%d), ".
+ "MySQL is configured with a small 'max_allowed_packet' (%d), ".
"which may cause some large writes to fail. Strongly consider raising ".
"this to at least %d in your MySQL configuration.",
$max_allowed_packet,
diff --git a/src/applications/config/check/PhabricatorStorageSetupCheck.php b/src/applications/config/check/PhabricatorStorageSetupCheck.php
--- a/src/applications/config/check/PhabricatorStorageSetupCheck.php
+++ b/src/applications/config/check/PhabricatorStorageSetupCheck.php
@@ -10,73 +10,116 @@
* @phutil-external-symbol class PhabricatorStartup
*/
protected function executeChecks() {
- $upload_limit = PhabricatorEnv::getEnvConfig('storage.upload-size-limit');
- if (!$upload_limit) {
+ $chunk_engine_active = false;
+
+ $engines = PhabricatorFileStorageEngine::loadWritableEngines();
+ foreach ($engines as $engine) {
+ if ($engine->isChunkEngine()) {
+ $chunk_engine_active = true;
+ break;
+ }
+ }
+
+ if (!$chunk_engine_active) {
+ $doc_href = PhabricatorEnv::getDocLink('Configuring File Storage');
+
$message = pht(
- 'The Phabricator file upload limit is not configured. You may only '.
- 'be able to upload very small files until you configure it, because '.
- 'some PHP default limits are very low (as low as 2MB).');
+ 'Large file storage has not been configured, which will limit '.
+ 'the maximum size of file uploads. See %s for '.
+ 'instructions on configuring uploads and storage.',
+ phutil_tag(
+ 'a',
+ array(
+ 'href' => $doc_href,
+ 'target' => '_blank',
+ ),
+ pht('Configuring File Storage')));
$this
- ->newIssue('config.storage.upload-size-limit')
- ->setShortName(pht('Upload Limit'))
- ->setName(pht('Upload Limit Not Yet Configured'))
- ->setMessage($message)
- ->addPhabricatorConfig('storage.upload-size-limit');
- } else {
- $memory_limit = PhabricatorStartup::getOldMemoryLimit();
- if ($memory_limit && ((int)$memory_limit > 0)) {
- $memory_limit_bytes = phutil_parse_bytes($memory_limit);
- $memory_usage_bytes = memory_get_usage();
- $upload_limit_bytes = phutil_parse_bytes($upload_limit);
-
- $available_bytes = ($memory_limit_bytes - $memory_usage_bytes);
-
- if ($upload_limit_bytes > $available_bytes) {
- $summary = pht(
- 'Your PHP memory limit is configured in a way that may prevent '.
- 'you from uploading large files.');
-
- $message = pht(
- 'When you upload a file via drag-and-drop or the API, the entire '.
- 'file is buffered into memory before being written to permanent '.
- 'storage. Phabricator needs memory available to store these '.
- 'files while they are uploaded, but PHP is currently configured '.
- 'to limit the available memory.'.
- "\n\n".
- 'Your Phabricator %s is currently set to a larger value (%s) than '.
- 'the amount of available memory (%s) that a PHP process has '.
- 'available to use, so uploads via drag-and-drop and the API will '.
- 'hit the memory limit before they hit other limits.'.
- "\n\n".
- '(Note that the application itself must also fit in available '.
- 'memory, so not all of the memory under the memory limit is '.
- 'available for buffering file uploads.)'.
- "\n\n".
- "The easiest way to resolve this issue is to set %s to %s in your ".
- "PHP configuration, to disable the memory limit. There is ".
- "usually little or no value to using this option to limit ".
- "Phabricator process memory.".
- "\n\n".
- "You can also increase the limit, or decrease %s, or ignore this ".
- "issue and accept that these upload mechanisms will be limited ".
- "in the size of files they can handle.",
- phutil_tag('tt', array(), 'storage.upload-size-limit'),
- phutil_format_bytes($upload_limit_bytes),
- phutil_format_bytes($available_bytes),
- phutil_tag('tt', array(), 'memory_limit'),
- phutil_tag('tt', array(), '-1'),
- phutil_tag('tt', array(), 'storage.upload-size-limit'));
-
- $this
- ->newIssue('php.memory_limit.upload')
- ->setName(pht('Memory Limit Restricts File Uploads'))
- ->setSummary($summary)
- ->setMessage($message)
- ->addPHPConfig('memory_limit')
- ->addPHPConfigOriginalValue('memory_limit', $memory_limit)
- ->addPhabricatorConfig('storage.upload-size-limit');
- }
+ ->newIssue('large-files')
+ ->setShortName(pht('Large Files'))
+ ->setName(pht('Large File Storage Not Configured'))
+ ->setMessage($message);
+ }
+
+ $post_max_size = ini_get('post_max_size');
+ if ($post_max_size && ((int)$post_max_size > 0)) {
+ $post_max_bytes = phutil_parse_bytes($post_max_size);
+ $post_max_need = (32 * 1024 * 1024) * 100;
+ if ($post_max_need > $post_max_bytes) {
+ $summary = pht(
+ 'Set %s in your PHP configuration to at least 32MB '.
+ 'to support large file uploads.',
+ phutil_tag('tt', array(), 'post_max_size'));
+
+ $message = pht(
+ 'Adjust %s in your PHP configuration to at least 32MB. When '.
+ 'set to smaller value, large file uploads may not work properly.',
+ phutil_tag('tt', array(), 'post_max_size'));
+
+ $this
+ ->newIssue('php.post_max_size')
+ ->setName(pht('PHP post_max_size Not Configured'))
+ ->setSummary($summary)
+ ->setMessage($message)
+ ->setGroup(self::GROUP_PHP)
+ ->addPHPConfig('post_max_size');
+ }
+ }
+
+ // This is somewhat arbitrary, but make sure we have enough headroom to
+ // upload a default file at the chunk threshold (8MB), which may be
+ // base64 encoded, then JSON encoded in the request, and may need to be
+ // held in memory in the raw and as a query string.
+ $need_bytes = (64 * 1024 * 1024);
+
+ $memory_limit = PhabricatorStartup::getOldMemoryLimit();
+ if ($memory_limit && ((int)$memory_limit > 0)) {
+ $memory_limit_bytes = phutil_parse_bytes($memory_limit);
+ $memory_usage_bytes = memory_get_usage();
+
+ $available_bytes = ($memory_limit_bytes - $memory_usage_bytes);
+
+ if ($need_bytes > $available_bytes) {
+ $summary = pht(
+ 'Your PHP memory limit is configured in a way that may prevent '.
+ 'you from uploading large files or handling large requests.');
+
+ $message = pht(
+ 'When you upload a file via drag-and-drop or the API, chunks must '.
+ 'be buffered into memory before being written to permanent '.
+ 'storage. Phabricator needs memory available to store these '.
+ 'chunks while they are uploaded, but PHP is currently configured '.
+ 'to severly limit the available memory.'.
+ "\n\n".
+ 'PHP processes currently have very little free memory available '.
+ '(%s). To work well, processes should have at least %s.'.
+ "\n\n".
+ '(Note that the application itself must also fit in available '.
+ 'memory, so not all of the memory under the memory limit is '.
+ 'available for running workloads.)'.
+ "\n\n".
+ "The easiest way to resolve this issue is to set %s to %s in your ".
+ "PHP configuration, to disable the memory limit. There is ".
+ "usually little or no value to using this option to limit ".
+ "Phabricator process memory.".
+ "\n\n".
+ "You can also increase the limit or ignore this issue and accept ".
+ "that you may encounter problems uploading large files and ".
+ "processing large requests.",
+ phutil_format_bytes($available_bytes),
+ phutil_format_bytes($need_bytes),
+ phutil_tag('tt', array(), 'memory_limit'),
+ phutil_tag('tt', array(), '-1'));
+
+ $this
+ ->newIssue('php.memory_limit.upload')
+ ->setName(pht('Memory Limit Restricts File Uploads'))
+ ->setSummary($summary)
+ ->setMessage($message)
+ ->setGroup(self::GROUP_PHP)
+ ->addPHPConfig('memory_limit')
+ ->addPHPConfigOriginalValue('memory_limit', $memory_limit);
}
}
diff --git a/src/applications/files/config/PhabricatorFilesConfigOptions.php b/src/applications/files/config/PhabricatorFilesConfigOptions.php
--- a/src/applications/files/config/PhabricatorFilesConfigOptions.php
+++ b/src/applications/files/config/PhabricatorFilesConfigOptions.php
@@ -147,26 +147,6 @@
"Set this to a valid Amazon S3 bucket to store files there. You ".
"must also configure S3 access keys in the 'Amazon Web Services' ".
"group.")),
- $this->newOption('storage.upload-size-limit', 'string', null)
- ->setSummary(
- pht('Limit to users in interfaces which allow uploading.'))
- ->setDescription(
- pht(
- "Set the size of the largest file a user may upload. This is ".
- "used to render text like 'Maximum file size: 10MB' on ".
- "interfaces where users can upload files, and files larger than ".
- "this size will be rejected. \n\n".
- "NOTE: **Setting this to a large size is NOT sufficient to ".
- "allow users to upload large files. You must also configure a ".
- "number of other settings.** To configure file upload limits, ".
- "consult the article 'Configuring File Upload Limits' in the ".
- "documentation. Once you've configured some limit across all ".
- "levels of the server, you can set this limit to an appropriate ".
- "value and the UI will then reflect the actual configured ".
- "limit.\n\n".
- "Specify this limit in bytes, or using a 'K', 'M', or 'G' ".
- "suffix."))
- ->addExample('10M', pht('Allow Uploads 10MB or Smaller')),
$this->newOption(
'metamta.files.public-create-email',
'string',
diff --git a/src/applications/files/controller/PhabricatorFileUploadController.php b/src/applications/files/controller/PhabricatorFileUploadController.php
--- a/src/applications/files/controller/PhabricatorFileUploadController.php
+++ b/src/applications/files/controller/PhabricatorFileUploadController.php
@@ -57,8 +57,7 @@
id(new AphrontFormFileControl())
->setLabel(pht('File'))
->setName('file')
- ->setError($e_file)
- ->setCaption($this->renderUploadLimit()))
+ ->setError($e_file))
->appendChild(
id(new AphrontFormTextControl())
->setLabel(pht('Name'))
@@ -102,25 +101,4 @@
));
}
- private function renderUploadLimit() {
- $limit = PhabricatorEnv::getEnvConfig('storage.upload-size-limit');
- $limit = phutil_parse_bytes($limit);
- if ($limit) {
- $formatted = phutil_format_bytes($limit);
- return 'Maximum file size: '.$formatted;
- }
-
- $doc_href = PhabricatorEnv::getDocLink(
- 'Configuring File Upload Limits');
- $doc_link = phutil_tag(
- 'a',
- array(
- 'href' => $doc_href,
- 'target' => '_blank',
- ),
- 'Configuring File Upload Limits');
-
- return hsprintf('Upload limit is not configured, see %s.', $doc_link);
- }
-
}
diff --git a/src/applications/files/exception/PhabricatorFileUploadException.php b/src/applications/files/exception/PhabricatorFileUploadException.php
--- a/src/applications/files/exception/PhabricatorFileUploadException.php
+++ b/src/applications/files/exception/PhabricatorFileUploadException.php
@@ -20,11 +20,6 @@
'Unable to write file: failed to write to temporary directory.',
UPLOAD_ERR_EXTENSION =>
'Unable to upload: a PHP extension stopped the upload.',
-
- -1000 =>
- pht("Uploaded file is too large: current limit is %s. To adjust this ".
- "limit change 'storage.upload-size-limit' in the Phabricator config.",
- PhabricatorEnv::getEnvConfig('storage.upload-size-limit')),
);
$message = idx($map, $code, 'Upload failed: unknown error.');
diff --git a/src/applications/files/storage/PhabricatorFile.php b/src/applications/files/storage/PhabricatorFile.php
--- a/src/applications/files/storage/PhabricatorFile.php
+++ b/src/applications/files/storage/PhabricatorFile.php
@@ -162,8 +162,6 @@
throw new Exception('File size disagrees with uploaded size.');
}
- self::validateFileSize(strlen($file_data));
-
return $file_data;
}
@@ -181,22 +179,9 @@
}
public static function newFromXHRUpload($data, array $params = array()) {
- self::validateFileSize(strlen($data));
return self::newFromFileData($data, $params);
}
- private static function validateFileSize($size) {
- $limit = PhabricatorEnv::getEnvConfig('storage.upload-size-limit');
- if (!$limit) {
- return;
- }
-
- $limit = phutil_parse_bytes($limit);
- if ($size > $limit) {
- throw new PhabricatorFileUploadException(-1000);
- }
- }
-
/**
* Given a block of data, try to load an existing file with the same content
diff --git a/src/docs/user/configuration/configuring_file_storage.diviner b/src/docs/user/configuration/configuring_file_storage.diviner
--- a/src/docs/user/configuration/configuring_file_storage.diviner
+++ b/src/docs/user/configuration/configuring_file_storage.diviner
@@ -1,45 +1,134 @@
@title Configuring File Storage
@group config
-Setup how Phabricator will store files.
+Setup file storage and support for large files.
Overview
========
-Phabricator allows users to upload files, and several applications use file
-storage (for instance, Maniphest allows you to attach files to tasks). You can
-configure several different storage systems.
+This document describes how to configure Phabricator to support large file
+uploads, and how to choose where Phabricator stores files.
-| System | Setup | Cost | Notes |
+There are two major things to configure:
+
+ - set up PHP and your HTTP server to accept large requests;
+ - choose and configure a storage engine.
+
+The following sections will guide you through this configuration.
+
+
+How Phabricator Stores Files
+============================
+
+Phabricator stores files in "storage engines", which are modular backends
+that implement access to some storage system (like MySQL, the filesystem, or
+a cloud storage service like Amazon S3).
+
+Phabricator stores large files by breaking them up into many chunks (a few
+megabytes in size) and storing the chunks in an underlying storage engine.
+This makes it easier to implement new storage engines and gives Phabricator
+more flexibility in managing file data.
+
+The first section of this document discusses configuring your install so that
+PHP and your HTTP server will accept requests which are larger than the size of
+one file chunk. Without this configuration, file chunk data will be rejected.
+
+The second section discusses choosing and configuring storage engines, so data
+is stored where you want it to be.
+
+
+Configuring Upload Limits
+=========================
+
+File uploads are limited by several pieces of configuration at different layers
+of the stack. Generally, the minimum value of all the limits is the effective
+one.
+
+To upload large files, you need to increase all the limits to at least
+**32MB**. This will allow you to upload file chunks, which will let Phabricator
+store arbitrarily large files.
+
+The settings which limit file uploads are:
+
+**HTTP Server**: The HTTP server may set a limit on the maximum request size.
+If you exceed this limit, you'll see a default server page with an HTTP error.
+These directives limit the total size of the request body, so they must be
+somewhat larger than the desired maximum filesize.
+
+ - **Apache**: Apache limits requests with the Apache `LimitRequestBody`
+ directive.
+ - **nginx**: nginx limits requests with the nginx `client_max_body_size`
+ directive. This often defaults to `1M`.
+ - **lighttpd**: lighttpd limits requests with the lighttpd
+ `server.max-request-size` directive.
+
+Set the applicable limit to at least **32MB**. Phabricator can not read these
+settings, so it can not raise setup warnings if they are misconfigured.
+
+**PHP**: PHP has several directives which limit uploads. These directives are
+found in `php.ini`.
+
+ - **post_max_size**: Maximum POST request size PHP will accept. If you
+ exceed this, Phabricator will give you a useful error. This often defaults
+ to `8M`. Set this to at least `32MB`. Phabricator will give you a setup
+ warning about this if it is set too low.
+ - **memory_limit**: For some uploads, file data will be read into memory
+ before Phabricator can adjust the memory limit. If you exceed this, PHP
+ may give you a useful error, depending on your configuration. It is
+ recommended that you set this to `-1` to disable it. Phabricator will
+ give you a setup warning about this if it is set too low.
+
+You may also want to configure these PHP options:
+
+ - **max_input_vars**: When files are uploaded via HTML5 drag and drop file
+ upload APIs, PHP parses the file body as though it contained normal POST
+ parameters, and may trigger `max_input_vars` if a file has a lot of
+ brackets in it. You may need to set it to some astronomically high value.
+ - **upload_max_filesize**: Maximum file size PHP will accept in a raw file
+ upload. This is not normally used when uploading files via drag-and-drop,
+ but affects some other kinds of file uploads. If you exceed this,
+ Phabricator will give you a useful error. This often defaults to `2M`. Set
+ this to at least `32MB`.
+
+Once you've adjusted all this configuration, your server will be able to
+receive chunk uploads. As long as you have somewhere to store them, this will
+enable you to store arbitrarily large files.
+
+
+Storage Engines
+===============
+
+Phabricator supports several different file storage engines:
+
+| Engine | Setup | Cost | Notes |
|========|=======|======|=======|
| MySQL | Automatic | Free | May not scale well. |
| Local Disk | Easy | Free | Does not scale well. |
| Amazon S3 | Easy | Cheap | Scales well. |
| Custom | Hard | Varies | Implement a custom storage engine. |
+You can review available storage engines and their configuration by navigating
+to {nav Applications > Files > Help/Options > Storage Engines} in the web UI.
+
By default, Phabricator is configured to store files up to 1MB in MySQL, and
reject files larger than 1MB. To store larger files, you can either:
- - configure local disk storage; or
- - configure Amazon S3 storage; or
- - raise the limits on MySQL.
+ - increase the MySQL limit to at least 8MB; or
+ - configure another storage engine.
-See the rest of this document for some additional discussion of engines.
+Doing either of these will enable the chunk storage engine and support for
+arbitrarily large files.
-You don't have to fully configure this immediately, the defaults are okay until
-you need to upload larger files and it's relatively easy to port files between
-storage engines later.
-
-Storage Engines
-===============
+The remaining sections of this document discuss the available storage engines
+and how to configure them.
-Builtin storage engines and information on how to configure them.
-== MySQL ==
+Engine: MySQL
+=============
- - **Pros**: Fast, no setup required.
- - **Cons**: Storing files in a database is a classic bad idea. Does not scale
- well. Maximum file size is limited.
+ - **Pros**: Low latency, no setup required.
+ - **Cons**: Storing files in a database is a classic bad idea. May become
+ difficult to administrate if you have a large amount of data.
MySQL storage is configured by default, for files up to (just under) 1MB. You
can configure it with these keys:
@@ -49,37 +138,43 @@
For most installs, it is reasonable to leave this engine as-is and let small
files (like thumbnails and profile images) be stored in MySQL, which is usually
-the lowest-latency filestore.
+the lowest-latency filestore, even if you configure another storage engine.
-To support larger files, configure another engine or increase this limit.
+To support large files, increase this limit to at least **8MB**. This will
+activate chunk storage in MySQL.
-== Local Disk ==
+Engine: Local Disk
+==================
- - **Pros**: Very simple. Almost no setup required.
+ - **Pros**: Simple to setup.
- **Cons**: Doesn't scale to multiple web frontends without NFS.
-To upload larger files:
+To configure file storage on the local disk, set:
- `storage.local-disk.path`: Set to some writable directory on local disk.
Make that directory.
-== Amazon S3 ==
+Engine: Amazon S3
+=================
- **Pros**: Scales well.
- - **Cons**: More complicated and expensive than other approaches.
+ - **Cons**: Slightly more complicated than other engines, not free.
-To enable file storage in S3, set these key:
+To enable file storage in S3, set these keys:
- - ##amazon-s3.access-key## Your AWS access key.
- - ##amazon-s3.secret-key## Your AWS secret key.
- - ##storage.s3.bucket## S3 bucket name where files should be stored.
+ - `amazon-s3.access-key`: Your AWS access key.
+ - `amazon-s3.secret-key`: Your AWS secret key.
+ - `storage.s3.bucket`: S3 bucket name where files should be stored.
-= Testing Storage Engines =
+Testing Storage Engines
+=======================
-You can test that things are correctly configured by going to the Files
-application (##/file/##) and uploading files.
+You can test that things are correctly configured by dragging and dropping
+a file onto the Phabricator home page. If engines have been configured
+properly, the file should upload.
-= Migrating Files Between Engines =
+Migrating Files Between Engines
+===============================
If you want to move files between storage engines, you can use the `bin/files`
script to perform migrations. For example, suppose you previously used MySQL but
@@ -95,10 +190,9 @@
You can use `--dry-run` to show which migrations would be performed without
taking any action. Run `bin/files help` for more options and information.
-= Next Steps =
+Next Steps
+==========
Continue by:
- - configuring file size upload limits with
- @{article:Configuring File Upload Limits}; or
- returning to the @{article:Configuration Guide}.
diff --git a/src/docs/user/configuration/configuring_file_upload_limits.diviner b/src/docs/user/configuration/configuring_file_upload_limits.diviner
deleted file mode 100644
--- a/src/docs/user/configuration/configuring_file_upload_limits.diviner
+++ /dev/null
@@ -1,77 +0,0 @@
-@title Configuring File Upload Limits
-@group config
-
-Explains limits on file upload sizes.
-
-= Overview =
-
-File uploads are limited by a large number of pieces of configuration, at
-multiple layers of the application. Generally, the minimum value of all the
-limits is the effective one. To upload large files, you need to increase all
-the limits above the maximum file size you want to support. The settings which
-limit uploads are:
-
- - **HTTP Server**: The HTTP server may set a limit on the maximum request
- size. If you exceed this limit, you'll see a default server page with an
- HTTP error. These directives limit the total size of the request body,
- so they must be somewhat larger than the desired maximum filesize.
- - **Apache**: Apache limits requests with the Apache `LimitRequestBody`
- directive.
- - **nginx**: nginx limits requests with the nginx `client_max_body_size`
- directive. This often defaults to `1M`.
- - **lighttpd**: lighttpd limits requests with the lighttpd
- `server.max-request-size` directive.
- - **PHP**: PHP has several directives which limit uploads. These directives
- are found in `php.ini`.
- - **upload_max_filesize**: Maximum file size PHP will accept in a file
- upload. If you exceed this, Phabricator will give you a useful error. This
- often defaults to `2M`.
- - **post_max_size**: Maximum POST request size PHP will accept. If you
- exceed this, Phabricator will give you a useful error. This often defaults
- to `8M`.
- - **memory_limit**: For some uploads, file data will be read into memory
- before Phabricator can adjust the memory limit. If you exceed this, PHP
- may give you a useful error, depending on your configuration.
- - **max_input_vars**: When files are uploaded via HTML5 drag and drop file
- upload APIs, PHP parses the file body as though it contained normal POST
- parameters, and may trigger `max_input_vars` if a file has a lot of
- brackets in it. You may need to set it to some astronomically high value.
- - **Storage Engines**: Some storage engines can be configured not to accept
- files over a certain size. To upload a file, you must have at least one
- configured storage engine which can accept it. Phabricator should give you
- useful errors if any of these fail.
- - **MySQL Engine**: Upload size is limited by the Phabricator setting
- `storage.mysql-engine.max-size`.
- - **Amazon S3**: Upload size is limited by Phabricator's implementation to
- `5G`.
- - **Local Disk**: Upload size is limited only by free disk space.
- - **Resource Constraints**: File uploads are limited by resource constraints
- on the application server. In particular, some uploaded files are written
- to disk in their entirety before being moved to storage engines, and all
- uploaded files are read into memory before being moved. These hard limits
- should be large for most servers, but will fundamentally prevent Phabricator
- from processing truly enormous files (GB/TB scale). Phabricator is probably
- not the best application for this in any case.
- - **Phabricator Master Limit**: The master limit, `storage.upload-size-limit`,
- is used to show upload limits in the UI.
-
-Phabricator can't read some of these settings, so it can't figure out what the
-current limit is or be much help at all in configuring it. Thus, you need to
-manually configure all of these limits and then tell Phabricator what you set
-them to. Follow these steps:
-
- - Pick some limit you want to set, like `100M`.
- - Configure all of the settings mentioned above to be a bit bigger than the
- limit you want to enforce (**note that there are some security implications
- to raising these limits**; principally, your server may become easier to
- attack with a denial-of-service).
- - Set `storage.upload-size-limit` to the limit you want.
- - The UI should now show your limit.
- - Upload a big file to make sure it works.
-
-= Next Steps =
-
-Continue by:
-
- - configuring file storage with @{article:Configuring File Storage}; or
- - returning to the @{article:Configuration Guide}.
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Dec 21, 9:50 AM (17 h, 46 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6913509
Default Alt Text
D12083.diff (28 KB)
Attached To
Mode
D12083: Rewrite file documentation to be chunk-aware
Attached
Detach File
Event Timeline
Log In to Comment