phacility/phabricator · error · Exception

Unable to upload file: this server is not configured with an

Error message

Unable to upload file: this server is not configured with any storage engine which can store large files.

What it means

PhabricatorFileUploadSource::getChunkEngine() calls PhabricatorFileStorageEngine::loadWritableChunkEngines(); an empty result means no storage engine that supports chunked storage is both configured and writable on this server. Chunking is required for uploads above the engine threshold, so large uploads are impossible until at least one chunk-capable engine (local disk, S3, MySQL blob engine as configured) is available.

Source

Thrown at src/applications/files/uploadsource/PhabricatorFileUploadSource.php:284

    }

    $mime_type = $this->getMimeType();
    if ($mime_type !== null) {
      $parameters['mime-type'] = $mime_type;
    }

    $author_phid = $this->getAuthorPHID();
    if ($author_phid !== null) {
      $parameters['authorPHID'] = $author_phid;
    }

    return $parameters;
  }

  private function getChunkEngine() {
    $chunk_engines = PhabricatorFileStorageEngine::loadWritableChunkEngines();
    if (!$chunk_engines) {
      throw new Exception(
        pht(
          'Unable to upload file: this server is not configured with any '.
          'storage engine which can store large files.'));
    }

    return head($chunk_engines);
  }

  private function setTotalBytesWritten($total_bytes_written) {
    $this->totalBytesWritten = $total_bytes_written;
    return $this;
  }

  private function getTotalBytesWritten() {
    return $this->totalBytesWritten;
  }

}

View on GitHub (pinned to 5720a38cfe)

Solutions

  1. Configure a storage engine, simplest is local disk: ./bin/config set storage.local-disk.path /var/phabricator/files (create the directory first).
  2. Ensure the PHP/daemon user can write there: mkdir -p /var/phabricator/files && chown www-data /var/phabricator/files (or grant group write).
  3. Re-test with a large upload; if using S3/other engines, verify their config keys and credentials so the engine passes the writable check.

Example fix

# before: no chunk engine configured, large upload fails
sudo mkdir -p /var/phabricator/files
sudo chown www-data:www-data /var/phabricator/files
./bin/config set storage.local-disk.path /var/phabricator/files
# after: retry the large upload
Defensive patterns

Strategy: validation

Validate before calling

if (!PhabricatorFileStorageEngine::loadWritableChunkEngines()) {
  // large uploads will fail; require configuration first
  throw new Exception('Configure a writable storage engine before accepting large uploads.');
}

Try / catch

try {
  $file = $source->uploadFile();
} catch (Exception $ex) {
  if (preg_match('/storage engine which can store large files/', $ex->getMessage())) {
    // surface a setup/ops error, not a client error
    throw new AphrontRecoverableException('File storage is not configured.');
  }
  throw $ex;
}

Prevention

When it happens

Trigger: Uploading a file large enough to trigger chunked upload (bigger than the single-write threshold) on an instance with no storage engine configured, or one whose engine fails its writability check — e.g. storage.local-disk.path never set, points at a missing directory, or the directory is not writable by the web/daemon user.

Common situations: Fresh Phabricator installs where no storage.local-disk.path (or S3 config) was provided; ops moving storage directories without updating permissions; S3 credentials/bucket misconfigured so the engine reports not writable.

Related errors


AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21). Data as JSON: /api/errors/d5c170cd8f8eee7f. Report an issue: GitHub.