8.5.x file.inc drupal_chmod($uri, $mode = NULL)
8.0.x file.inc drupal_chmod($uri, $mode = NULL)
8.1.x file.inc drupal_chmod($uri, $mode = NULL)
8.2.x file.inc drupal_chmod($uri, $mode = NULL)
8.3.x file.inc drupal_chmod($uri, $mode = NULL)
8.4.x file.inc drupal_chmod($uri, $mode = NULL)
8.6.x file.inc drupal_chmod($uri, $mode = NULL)
7.x file.inc drupal_chmod($uri, $mode = NULL)

Sets the permissions on a file or directory.

This function will use the 'file_chmod_directory' and 'file_chmod_file' variables for the default modes for directories and uploaded/generated files. By default these will give everyone read access so that users accessing the files with a user account without the webserver group (e.g. via FTP) can read these files, and give group write permissions so webserver group members (e.g. a vhost account) can alter files uploaded and owned by the webserver.

PHP's chmod does not support stream wrappers so we use our wrapper implementation which interfaces with chmod() by default. Contrib wrappers may override this behavior in their implementations as needed.


$uri: A string containing a URI file, or directory path.

$mode: Integer value for the permissions. Consult PHP chmod() documentation for more information.

Return value

TRUE for success, FALSE in the event of an error.

Related topics

7 calls to drupal_chmod()
FileDirectoryTest::testFileCheckDirectoryHandling in modules/simpletest/tests/file.test
Test directory handling functions.
file_create_htaccess in includes/file.inc
Creates a .htaccess file in the given directory.
file_prepare_directory in includes/file.inc
Checks that the directory exists and is writable.
file_save_upload in includes/file.inc
Saves a file upload to a new location.
file_unmanaged_copy in includes/file.inc
Copies a file to a new location without invoking the file API.

... See full list


includes/file.inc, line 2254
API for handling file uploads and server file management.


function drupal_chmod($uri, $mode = NULL) {
  if (!isset($mode)) {
    if (is_dir($uri)) {
      $mode = variable_get('file_chmod_directory', 0775);
    else {
      $mode = variable_get('file_chmod_file', 0664);

  // If this URI is a stream, pass it off to the appropriate stream wrapper.
  // Otherwise, attempt PHP's chmod. This allows use of drupal_chmod even
  // for unmanaged files outside of the stream wrapper interface.
  if ($wrapper = file_stream_wrapper_get_instance_by_uri($uri)) {
    if ($wrapper
      ->chmod($mode)) {
      return TRUE;
  else {
    if (@chmod($uri, $mode)) {
      return TRUE;
  watchdog('file', 'The file permissions could not be set on %uri.', array(
    '%uri' => $uri,
  return FALSE;


starlocke’s picture

While octal is consise and easy-to-understand by most system admins, since we're limited to decimal values for file_chmod_directory, it is simply a matter of converting your octal value to a decimal value.

A neat one-liner with most *nix command lines to convert numbers to decimal format:

echo $((some_number))

Then you plug that value into the file_chmod_directory.

For example:

echo $((02775)) -- directory permissions; effectively = rwx:rws:r-x; note that I like using "setgid", known as the octal 02000.
drush variable-set file_chmod_directory 1533 -- setting the variable using drush (or use whatever other method you like to set the value)

Ref: http://linuxcommando.blogspot.ca/2008/04/quick-hex-decimal-conversion-us...

See also: http://drupal.org/node/1836398 "Setting octal values with VSET" (contains a copy of this same comment)