file_unmanaged_prepare($source, &$destination = NULL, $replace = FILE_EXISTS_RENAME)
Internal function that prepares the destination for a file_unmanaged_copy or file_unmanaged_move operation.
- Checks if $source and $destination are valid and readable/writable.
- Checks that $source is not equal to $destination; if they are an error is reported.
- If file already exists in $destination either the call will error out, replace the file or rename the file based on the $replace parameter.
Parameters
$source: A string specifying the filepath or URI of the source file.
$destination: A URI containing the destination that $source should be moved/copied to. The URI may be a bare filepath (without a scheme) and in that case the default scheme (file://) will be used. If this value is omitted, Drupal's default files scheme will be used, usually "public://".
$replace: Replace behavior when the destination file already exists:
- FILE_EXISTS_REPLACE - Replace the existing file.
- FILE_EXISTS_RENAME - Append _{incrementing number} until the filename is unique.
- FILE_EXISTS_ERROR - Do nothing and return FALSE.
Return value
TRUE, or FALSE in the event of an error.
See also
Related topics
- File interface
- Common file handling functions.
File
- core/includes/file.inc, line 497
- API for handling file uploads and server file management.
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | function file_unmanaged_prepare( $source , & $destination = NULL, $replace = FILE_EXISTS_RENAME) { $original_source = $source ; $logger = \Drupal::logger( 'file' ); // Assert that the source file actually exists. if (! file_exists ( $source )) { // @todo Replace drupal_set_message() calls with exceptions instead. drupal_set_message(t( 'The specified file %file could not be moved/copied because no file by that name exists. Please check that you supplied the correct filename.' , array ( '%file' => $original_source )), 'error' ); if (( $realpath = drupal_realpath( $original_source )) !== FALSE) { $logger ->notice( 'File %file (%realpath) could not be moved/copied because it does not exist.' , array ( '%file' => $original_source , '%realpath' => $realpath )); } else { $logger ->notice( 'File %file could not be moved/copied because it does not exist.' , array ( '%file' => $original_source )); } return FALSE; } // Build a destination URI if necessary. if (!isset( $destination )) { $destination = file_build_uri(drupal_basename( $source )); } // Prepare the destination directory. if (file_prepare_directory( $destination )) { // The destination is already a directory, so append the source basename. $destination = file_stream_wrapper_uri_normalize( $destination . '/' . drupal_basename( $source )); } else { // Perhaps $destination is a dir/file? $dirname = drupal_dirname( $destination ); if (!file_prepare_directory( $dirname )) { // The destination is not valid. $logger ->notice( 'File %file could not be moved/copied because the destination directory %destination is not configured correctly.' , array ( '%file' => $original_source , '%destination' => $dirname )); drupal_set_message(t( 'The specified file %file could not be moved/copied because the destination directory is not properly configured. This may be caused by a problem with file or directory permissions. More information is available in the system log.' , array ( '%file' => $original_source )), 'error' ); return FALSE; } } // Determine whether we can perform this operation based on overwrite rules. $destination = file_destination( $destination , $replace ); if ( $destination === FALSE) { drupal_set_message(t( 'The file %file could not be moved/copied because a file by that name already exists in the destination directory.' , array ( '%file' => $original_source )), 'error' ); $logger ->notice( 'File %file could not be moved/copied because a file by that name already exists in the destination directory (%destination)' , array ( '%file' => $original_source , '%destination' => $destination )); return FALSE; } // Assert that the source and destination filenames are not the same. $real_source = drupal_realpath( $source ); $real_destination = drupal_realpath( $destination ); if ( $source == $destination || ( $real_source !== FALSE) && ( $real_source == $real_destination )) { drupal_set_message(t( 'The specified file %file was not moved/copied because it would overwrite itself.' , array ( '%file' => $source )), 'error' ); $logger ->notice( 'File %file could not be moved/copied because it would overwrite itself.' , array ( '%file' => $source )); return FALSE; } // Make sure the .htaccess files are present. file_ensure_htaccess(); return TRUE; } |
Please login to continue.