7 file.inc file_save(stdClass $file)

Saves a file object to the database.

If the $file->fid is not set a new record will be added.

Parameters

$file: A file object returned by file_load().

Return value

The updated file object.

See also

hook_file_insert()

hook_file_update()

Related topics

12 calls to file_save()
EntityCrudHookTestCase::testFileHooks in modules/simpletest/tests/entity_crud_hook_test.test
Tests hook invocations for CRUD operations on files.
FileSaveTest::testFileSave in modules/simpletest/tests/file.test
file_copy in includes/file.inc
Copies a file to a new location and adds a file record to the database.
file_field_presave in modules/file/file.field.inc
Implements hook_field_presave().
file_move in includes/file.inc
Moves a file to a new location and update the file's database entry.

... See full list

File

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

Code

function file_save(stdClass $file) {
  $file->timestamp = REQUEST_TIME;
  $file->filesize = filesize($file->uri);

  // Load the stored entity, if any.
  if (!empty($file->fid) && !isset($file->original)) {
    $file->original = entity_load_unchanged('file', $file->fid);
  }

  module_invoke_all('file_presave', $file);
  module_invoke_all('entity_presave', $file, 'file');

  if (empty($file->fid)) {
    drupal_write_record('file_managed', $file);
    // Inform modules about the newly added file.
    module_invoke_all('file_insert', $file);
    module_invoke_all('entity_insert', $file, 'file');
  }
  else {
    drupal_write_record('file_managed', $file, 'fid');
    // Inform modules that the file has been updated.
    module_invoke_all('file_update', $file);
    module_invoke_all('entity_update', $file, 'file');
  }

  // Clear internal properties.
  unset($file->original);
  // Clear the static loading cache.
  entity_get_controller('file')->resetCache(array($file->fid));

  return $file;
}

Comments

Replaced to $file->save() in Drupal 8

file_save() appends a few file object attributes like timestamp, filesize, but if you are simply sucking in a file from disk (like from a cron job or drush file load) and not working with an html form upload file field, you'll want to be add your own mimetype, like:

<?php
  $file
= file_save((object)array(
   
'filename' => $file_name,
   
'uri' => $destination_uri,
   
'status' => FILE_STATUS_PERMANENT,
   
'filemime' => file_get_mimetype($destination_uri),
  ));
?>

file_get_mimetype() does the magic. Note: Get $file_name from

<?php
 basename
($destination_uri);
?>

which works on either uri or full path.