You are here

function file_service_save in Services 6.2

Same name and namespace in other branches
  1. 7 services/file_service/file_service.inc \file_service_save()

Save file information.

This is basically a copy of file_save_upload() from includes/file.inc without the upload-specific requirements. In D7 with File API this will be a lot easier to deal with.

Parameters

$file: Array representing the file information

1 string reference to 'file_service_save'
file_service_service in services/file_service/file_service.module
Implementation of hook_service().

File

services/file_service/file_service.inc, line 51
Link general file functionalities to services module.

Code

function file_service_save($file) {
  global $user;
  $file = (object) $file;

  // If the file data is empty then bail
  if (!isset($file->file)) {
    return FALSE;
  }

  // If the submitted file is an update, then set the update parameter for
  // drupal_write_record(), indicating such. Otherwise we can just pass the
  // object in and it will be treated as an insert.
  $update = array();
  if (!empty($file->fid)) {
    $update = 'fid';
  }

  // Build the list of non-munged extensions.
  // @todo: this should not be here. we need to figure out the right place.
  // @todo: also isn't that repeated variable get a waste? I mean, I guess it
  //        is cached but still it is pretty ugly.
  $extensions = '';
  foreach ($user->roles as $rid => $name) {
    $extensions .= ' ' . variable_get("upload_extensions_{$rid}", variable_get('upload_extensions_default', 'jpg jpeg gif png txt html doc xls pdf ppt pps odt ods odp'));
  }

  // Get the directory name for the location of the file:
  $dir = dirname($file->filepath);

  // Build the destination folder tree if it doesn't already exists.
  if (!file_check_directory($dir, FILE_CREATE_DIRECTORY)) {
    return services_error("Could not create destination directory for file.");
  }

  // Update file object as necessary
  $file->filepath = file_destination(file_create_path($file->filepath), FILE_EXISTS_RENAME);

  // If filename has not been specified extract it from filepath.
  if (!isset($file->filename) || empty($file->filename)) {
    $file->filename = trim(basename($file->filepath), '.');
  }
  $file->filename = file_munge_filename($file->filename, $extensions, TRUE);
  $file->filemime = file_get_mimetype($file->filename);

  // Rename potentially executable files, to help prevent exploits.
  if (preg_match('/\\.(php|pl|py|cgi|asp|js)$/i', $file->filename) && substr($file->filename, -4) != '.txt') {
    $file->filemime = 'text/plain';
    $file->filepath .= '.txt';
    $file->filename .= '.txt';
  }

  // If the destination is not provided, or is not writable, error our
  if (empty($file->filepath) || file_check_path($file->filepath) === FALSE) {
    return services_error("Destintion directory does not exist or is not writeable.");
  }

  //The filepath that ends up in the node must contain the filename
  $file->filepath .= '/' . $file->filename;

  // Write the file
  if (!file_save_data(base64_decode($file->file), $file->filepath)) {
    return services_error("Could not write file to destination");
  }

  // If we made it this far it's safe to record this file in the database.
  drupal_write_record('files', $file, $update);

  // hook_file_insert() requires an object
  if (empty($update)) {
    foreach (module_implements('file_insert') as $module) {
      $function = $module . '_file_insert';
      $function($file);
    }
  }

  // Return the fid
  return $file->fid;
}