Same filename and directory in other branches
  1. 4.7.x developer/examples/fileupload.module
  2. 5.x developer/examples/fileupload.module

This is an example to demonstrate how to make a Drupal node support file uploads.

@Database definition:


  CREATE TABLE fileupload (
    nid int(10) unsigned NOT NULL default '0',
    basename varchar(255) not null,
    filepath varchar(255) not null,
    mime varchar(255) not null,
    size int(10) unsigned not null
  );

File

developer/examples/fileupload.module
View source
<?php

/**
 * @file
 * This is an example to demonstrate how to make a Drupal node support file
 * uploads.
 *
 * @Database definition:
 * @code
 *   CREATE TABLE fileupload (
 *     nid int(10) unsigned NOT NULL default '0',
 *     basename varchar(255) not null,
 *     filepath varchar(255) not null,
 *     mime varchar(255) not null,
 *     size int(10) unsigned not null
 *   );
 * @endcode
 */

/** Integrate with Drupal */
function fileupload_link($type) {
  if ($type == 'system' && user_access('create files')) {
    menu('node/add/fileupload', t('file upload'), 'node_page', 1);
  }
}
function fileupload_perm() {
  return array(
    'create files',
  );
}
function fileupload_help($section) {
  switch ($section) {
    case 'admin/system/modules#description':
    case 'node/add#fileupload':
      return t('Simple file node example.');
  }
}

/** Support private downloads */
function fileupload_file_download($file) {
  if (user_access('access content')) {
    if ($mime = db_result(db_query("SELECT mime FROM {fileupload} WHERE filepath = '%s'", file_create_path($file)))) {
      return array(
        "Content-type: {$mime}",
      );
    }
  }
}

/** Node related code */
function fileupload_node_name() {
  return t('file');
}
function fileupload_view($node, $main = 0, $page = 0) {

  // Only create link to file when it is in the proper location.
  if ($node->size && file_check_location($node->filepath, variable_get('file_directory_path', 'files'))) {
    $node->body = '<a href="' . file_create_url($node->filepath) . '">' . $node->basename . '</a> (' . format_size($node->size) . ')';
  }
  elseif ($file = $node->file) {
    $node->body = $file->name . ' (' . format_size($file->size) . ')';
  }
  else {
    $node->body = basename($node->filepath) . ' (' . format_size(filesize($node->filepath)) . ')';
  }
  return theme('node', $node, $main, $page);
}
function fileupload_form(&$node, &$error, &$param) {

  // Set form parameters so we can accept file uploads.
  $param['options'] = array(
    'enctype' => 'multipart/form-data',
  );
  $output = form_file(t('File'), 'file', 40, $error['file'] ? theme('error', $error['file']) : t('A file already exists, if you upload another file the current file will be replaced.'));
  if ($node->nid) {
    $output .= form_hidden('filepath', $node->filepath);
  }
  return $output;
}
function fileupload_validate(&$node) {
  $error = array();

  // Check for a new file upload.
  if ($file = file_save_upload('file')) {
    $node->file = $file;
  }

  // Make sure there is a file upload, or an existing file in case of updates.
  if (!$node->file && !file_exists($node->filepath)) {
    $error['file'] = t('Missing file.');
  }
  return $error;
}
function fileupload_access($op, $node) {
  global $user;
  switch ($op) {
    case 'view':
      return $node->status;
    case 'create':
      return user_access("create file");
    case 'update':
    case 'delete':
      return user_access("create file") && $user->uid == $node->uid;
  }
}
function fileupload_load($node) {
  return db_fetch_object(db_query('SELECT * FROM {fileupload} WHERE nid = %d', $node->nid));
}
function fileupload_insert($node) {
  $file = $node->file;
  $file = file_save_upload($file, $file->name);
  db_query("INSERT INTO {fileupload} (nid, basename, filepath, mime, size) VALUES (%d, '%s', '%s', '%s', %d)", $node->nid, $file->name, $file->path, $file->type, $file->size);
}
function fileupload_update($node) {

  // Remove old file.
  file_delete(db_result(db_query('SELECT filepath FROM {fileupload} WHERE nid = %d', $node->nid)));

  // Save new file
  $file = $node->file;
  $file = file_save_upload($file, $file->name);
  db_query("UPDATE {fileupload} SET basename = '%s', filepath = '%s', mime = '%s', size = %d WHERE nid = %d", $file->name, $file->path, $file->type, $file->size, $node->nid);
}
function fileupload_delete($node) {
  file_delete($node->filepath);
  db_query("DELETE FROM {fileupload} WHERE nid = %d", $node->nid);
}

Functions