web-dev-qa-db-fra.com

Comment créer une URL de téléchargement de fichier?

La fonction file_entity_download_uri() ne semble plus exister dans Drupal 8.4, et je dois créer une URL de téléchargement pour un fichier. Je ne voudrais pas exposer directement l'emplacement du fichier.

4
José Trindade

Si vous avez utilisé un champ Média, j'ai construit un module à cet effet: http://drupal.org/project/media_entity_download - il prendra des fichiers dans un objet média et leur donnera un instant téléchargez uri. Il n'affichera pas le chemin d'accès réel du fichier à l'utilisateur.

Si vous avez juste un champ de fichier, vous regardez essentiellement ce que fait l'option de fichiers privés.

En fin de compte, vous auriez besoin d'une solution qui assure un BinaryFileResponse d'un contrôleur, vous pouvez voir un exemple dans mon module .

3
Kevin

si vous utilisez un média, ce code peut fonctionner pour vous:

$file = Media::load(your_file_id); $file_uri = $file->field_file->entity->getFileUri(); $file_downloadable_link = file_create_url($file_uri);

2
Mohammed ATIFI

Si vous avez juste un ou plusieurs fichiers statiques sur votre serveur que vous souhaitez que les utilisateurs téléchargent, comme dans le répertoire/files (suggérez d'utiliser/files/download/[filename]). Vous voudrez créer une route et un contrôleur pour cela. Rendez ensuite le lien via l'itinéraire dans un bloc. Vous pouvez également avoir un formulaire qui soumet le gestionnaire appelle la route avec le nom de fichier requis.

Cela ne devrait pas non plus montrer le chemin de fichier réel à l'utilisateur, juste le nom de fichier et celui de son site http://example.com

Notez également: j'ai ajouté cela ici en raison du titre du problème OP ... Cela pourrait faire gagner du temps à quelqu'un lors de la recherche sur le lien de téléchargement de fichiers Drupal 8.

example.routing.yml

example.download.file:
  path: '/download/file/{file_name}'
  defaults:
    _controller: '\Drupal\example\Controller\Download::downloadFile'
  requirements:
    _permission: 'access content'

src/Controller/Download.php

<?php

namespace Drupal\example\Controller;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpFoundation\BinaryFileResponse;

/**
 * Handle /download/file/ URLs to redirect to content download based on filename.
 */
class Download extends ControllerBase {

  /**
   * Download file.
   *
   * @param string $filename
   *   The filename.
   */
  public function downloadItemTypeExport($filename) {

    // Do some file validation here, like checking for extension.

    // File lives in /files/downloads.
    $uri_prefix = 'public://downloads/';

    $uri = $uri_prefix . $filename;

    $headers = [
      'Content-Type' => 'text/csv', // Would want a condition to check for extension and set Content-Type dynamically
      'Content-Description' => 'File Download',
      'Content-Disposition' => 'attachment; filename=' . $filename
    ];

    // Return and trigger file donwload.
    return new BinaryFileResponse($uri, 200, $headers, true );

  }
}

src\Plugin\Block code

<?php

namespace Drupal\example\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Url;

/**
 * @Block(
 *   id = "example_download_files",
 *   admin_label = @Translation("Example Download Files"),
 *   category = @Translation("Example")
 * )
 */
class ExampleDownloadFiles extends BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {
    $build = [];


    $items = [
      'Foo' => 'foo.csv',
      'Bar' => 'bar.csv',
      'Herp' => 'herp.csv',
      'Derp' => 'derp.csv'
    ];


    foreach ($items as $item => $filename) {
      $url = Url::fromRoute('example.download.file', ['file_name' => $filename]);
      $links[$item] = [
        '#title' => $this->t($item),
        '#type' => 'link',
        '#url' => $url
      ];
    }

    $file_download_list = [
      '#theme' => 'item_list',
      '#items' => $links
    ];

    $build['file_downloads'] = [
      '#type' => 'container',
      'file_downloads_prefix' => ['#type' => 'html_tag', '#tag' => 'p', '#value' => $this->t('Download the csv:')],
      'file_downloads_list' => $file_download_list,

    ];

    return $build;

  }
1
ZhuRenTongKu