---
url: 'https://metadrop.net/es/articulos/gestionar-fichero-formulario-administracion-drupal-8'
title: 'Cómo gestionar un fichero mediante un formulario de administración en Drupal 8'
author: 'Agustin Gómez'
date: '2017-11-10T11:38:13+00:00'
updated: '2024-11-11T12:04:11+00:00'
type: article
summary: 'Drupal gestiona ficheros mediante campos en entidades pero ¿cómo gestionar un fichero en un formulario de administración?'
tags:
  - Config
  - 'Form API'
image: 'https://metadrop.net/sites/default/files/imce/image/article/kelly-sikkema-mdADGzyXCVE-unsplash.jpg'
published: true
og:
  determiner: Automatic
  site_name: Metadrop
  'image:alt': 'Cómo gestionar un fichero mediante un formulario de administración en Drupal 8'
  street_address: 'Calle Manuel Luna, 12, 3 Dcha'
  locality: Madrid
  region: Madrid
  postal_code: '28020'
  country_name: España
  email: hola@metadrop.net
  phone_number: '910053180'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      '@type': Article
      '@id': 'https://metadrop.net/es/articulos/gestionar-fichero-formulario-administracion-drupal-8#article'
      name: 'Cómo gestionar un fichero mediante un formulario de administración en Drupal 8'
      headline: 'Cómo gestionar un fichero mediante un formulario de administración en Drupal 8'
      description: 'Drupal gestiona ficheros mediante campos en entidades pero ¿cómo gestionar un fichero en un formulario de administración?'
      about:
        - Configuración
        - 'Form API'
      datePublished: '2017-11-20T11:11:11+0100'
      dateModified: '2024-11-11T13:04:11+0100'
      author:
        '@type': Person
        name: 'Agustin Gómez'
      publisher:
        '@type': Organization
        '@id': 'https://metadrop.net/#organization'
      mainEntityOfPage: 'https://metadrop.net/es/articulos/gestionar-fichero-formulario-administracion-drupal-8'
    -
      '@type': Organization
      '@id': 'https://metadrop.net/#organization'
      url: 'https://metadrop.net/'
      name: Metadrop
      sameAs:
        - 'https://www.drupal.org/metadrop'
        - 'https://twitter.com/metadrop'
        - 'https://asociaciondrupal.es/partner/metadrop'
        - 'https://www.linkedin.com/company/metadrop'
      logo:
        '@type': ImageObject
        url: 'https://metadrop.net/themes/custom/mdrop_radix/logo-metadrop-500-500.jpg'
        width: '500'
        height: '500'
    -
      '@type': ItemPage
      '@id': 'https://metadrop.net/es/articulos/gestionar-fichero-formulario-administracion-drupal-8'
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Inicio
            item: 'https://metadrop.net/es'
          -
            '@type': ListItem
            position: 2
            name: 'Artículos expertos sobre Drupal y tecnología'
            item: 'https://metadrop.net/es/articulos'
      publisher:
        '@type': Organization
        '@id': 'https://metadrop.net/#organization'
---
 1. [Artículos](https://metadrop.net/es/articulos)
 
  

# Cómo gestionar un fichero mediante un formulario de administración en Drupal 8

Lunes 20 de Noviembre de 2017

 

 



Drupal gestiona ficheros mediante campos en entidades pero ¿cómo gestionar un fichero en un formulario de administración?



   



Si queremos que un contenido en Drupal tenga un fichero, es tan fácil como añadir un campo de tipo fichero a la entidad correspondiente, normalmente un nodo aunque podría ser otra entidad como por ejemplo un usuario. De esta forma obtendremos tanto un campo para subir el fichero en el formulario de edición de la entidad como control sobre cómo se mostrará el fichero al visitante.

Pero, ¿cómo hacerlo para un formulario de administración? Estos formularios no son entidades y por tanto no podemos añadirles campos tan fácilmente como lo haríamos con un contenido normal.

La solución pasa por realizar la gestión del fichero mediante código. Podemos simplemente añadir a nuestro formulario un elemento de formulario de tipo *managed\_file*. El problema principal que nos encontramos al enviar el formulario es que el archivo va a ser considerado como temporal por Drupal. Esto significa que aunque el fichero se sube correctamente y estará disponible, pasadas unas horas drupal borrará el fichero durante las tareas rutinarias de limpieza, dejando la funcionalidad que use ese fichero en un estado inconsistente.

Para solucionar el problema, en el submit del formulario cargamos el archivo y mediante la función [*setPermanent*](https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3AsetPermanent/8.4.x "función setPermanent") indicamos a Drupal que el fichero debe ser conservado. Básicamente estamos modificando el *status* a 1 (valor de la constante FILE\_STATUS\_PERMANENT definida en el fichero [file.inc](https://api.drupal.org/api/drupal/core%21includes%21file.inc/8.4.x "file.inc")). Si no queremos invocar el Field API de Drupal, tenemos el recurso de la función [*file\_unmanaged\_save\_data*](https://api.drupal.org/api/drupal/core%21includes%21file.inc/function/file_unmanaged_save_data/8.4.x "Función file_unmanaged_save_data"), que no vamos a tratar aquí.

A continuación se muestra un ejemplo de código:


```php
class MyModuleSettingsConfigurationForm extends ConfigFormBase {
  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'my_module_admin_settings';
  }

  /**
   * {@inheritdoc}
   */
  protected function getEditableConfigNames() {
    return [
      'my_module.settings',
    ];
  }

  public function buildForm(array $form, FormStateInterface $form_state, Request $request = NULL) {

    $config = $this->config('my_module.settings');
    $allowed_ext = 'doc docx pdf jpg';
    $max_upload = 25600000;

    $form['my_file_fid'] = [
      '#type' => 'managed_file',
      '#title' => $this->t('Document'),
      '#description' => $this->t('Valid extensions: @allowed_ext', ['@allowed_ext' => $allowed_ext]),
      // @NOTE: add your folder here!
      '#upload_location' => 'public://test/',
      '#multiple' => FALSE,
      '#required' => TRUE,
      // No need array, $config->get already give us an array format.
      '#default_value' => $config->get('my_file_fid'),
      '#upload_validators' => [
        'file_validate_extensions' => [
          $allowed_ext,
        ],
        'file_validate_size' => [
          $max_upload,
        ],
      ],
    ];

    return parent::buildForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $values = $form_state->getValues();

    $fid = reset($form_state->getValue('my_file_fid'));
    $file = File::load($fid);

    // We don't want to lose it after 6 hours (default Drupal's value), since it is going to be used
    // in some forms (will be downloaded).
    $file->setPermanent();
    $file->save();

    // Save configuration settings.
    $this->config('my_module.settings')
      ->set('my_file_fid', $values['my_file_fid'])
      ->save();
  }
}
```

El método buildForm construye el formulario añadiendo el campo de subida de fichero (my\_file\_fid). En el submit del formulario consultando el valor de dicho campo obtenemos el *fid* del fichero. Solo necesitamos cargarlo y hacerlo permanente como hemos comentado antes.

Tećnicamente, mediante el método:


```php
￼￼￼￼$file->setPermanent();
```

estamos indicando que el archivo no debe ser borrado por Drupal de la tabla *file\_managed*, aunque ningún módulo lo esté usando (tabla *file\_usage*). El uso de la tabla *file\_usage*, también queda fuera de este post, pero tenlo en cuenta si el archivo va a ser usado por algún módulo (o el tuyo).

Aunque aquí lo hemos explicado para un formularios de administración, este método lógicamente sirve para cualquier formulario que no sea de una entidad (dado que las entidades sí gestionan automáticamente los ficheros subidos) al que le añadamos un campo de subida de ficheros.



[Configuración](https://metadrop.net/es/articulos?text=Configuraci%C3%B3n)

[Form API](https://metadrop.net/es/articulos?text=Form%20API)

 

[Desarrollo de módulos e integraciones de terceros con Drupal](https://metadrop.net/es/servicios/drupal/integraciones " See Desarrollo de módulos e integraciones de terceros con Drupal")

Metadrop conecta Drupal con tu CRM, ERP, pasarela de pago y stack de marketing — Salesforce, Microsoft Dynamics, TPV virtual de BBVA, Workday y Keepeek — mediante módulos personalizados y APIs seguras y conformes con el RGPD.

 

 Ver más