function system_retrieve_file
Same name in other branches
- 7.x modules/system/system.module \system_retrieve_file()
- 8.9.x core/modules/system/system.module \system_retrieve_file()
- 10 core/modules/system/system.module \system_retrieve_file()
Attempts to get a file using Guzzle HTTP client and to store it locally.
Parameters
string $url: The URL of the file to grab.
string $destination: Stream wrapper URI specifying where the file should be placed. If a directory path is provided, the file is saved into that directory under its original name. If the path contains a filename as well, that one will be used instead. If this value is omitted, the site's default files scheme will be used, usually "public://".
bool $managed: If this is set to TRUE, the file API hooks will be invoked and the file is registered in the database.
int $replace: Replace behavior when the destination file already exists:
- FileSystemInterface::EXISTS_REPLACE: Replace the existing file.
- FileSystemInterface::EXISTS_RENAME: Append _{incrementing number} until the filename is unique.
- FileSystemInterface::EXISTS_ERROR: Do nothing and return FALSE.
Return value
mixed One of these possibilities:
- If it succeeds and $managed is FALSE, the location where the file was saved.
- If it succeeds and $managed is TRUE, a \Drupal\file\FileInterface object which describes the file.
- If it fails, FALSE.
3 calls to system_retrieve_file()
- locale_translation_download_source in core/
modules/ locale/ locale.batch.inc - Downloads a translation file from a remote server.
- RetrieveFileTest::testFileRetrieving in core/
modules/ system/ tests/ src/ Functional/ System/ RetrieveFileTest.php - Invokes system_retrieve_file() in several scenarios.
- update_manager_file_get in core/
modules/ update/ update.manager.inc - Copies a file from the specified URL to the temporary directory for updates.
File
-
core/
modules/ system/ system.module, line 1187
Code
function system_retrieve_file($url, $destination = NULL, $managed = FALSE, $replace = FileSystemInterface::EXISTS_RENAME) {
$parsed_url = parse_url($url);
/** @var \Drupal\Core\File\FileSystemInterface $file_system */
$file_system = \Drupal::service('file_system');
if (!isset($destination)) {
$path = $file_system->basename($parsed_url['path']);
$path = \Drupal::config('system.file')->get('default_scheme') . '://' . $path;
$path = \Drupal::service('stream_wrapper_manager')->normalizeUri($path);
}
else {
if (is_dir($file_system->realpath($destination))) {
// Prevent URIs with triple slashes when glueing parts together.
$path = str_replace('///', '//', "{$destination}/") . \Drupal::service('file_system')->basename($parsed_url['path']);
}
else {
$path = $destination;
}
}
try {
$data = (string) \Drupal::httpClient()->get($url)
->getBody();
if ($managed) {
/** @var \Drupal\file\FileRepositoryInterface $file_repository */
$file_repository = \Drupal::service('file.repository');
$local = $file_repository->writeData($data, $path, $replace);
}
else {
$local = $file_system->saveData($data, $path, $replace);
}
} catch (TransferException $exception) {
\Drupal::messenger()->addError(t('Failed to fetch file due to error "%error"', [
'%error' => $exception->getMessage(),
]));
return FALSE;
} catch (FileException|InvalidStreamWrapperException $e) {
\Drupal::messenger()->addError(t('Failed to save file due to error "%error"', [
'%error' => $e->getMessage(),
]));
return FALSE;
}
if (!$local) {
\Drupal::messenger()->addError(t('@remote could not be saved to @path.', [
'@remote' => $url,
'@path' => $path,
]));
}
return $local;
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.