web-dev-qa-db-ja.com

ファイルダウンロードURLを作成するにはどうすればよいですか?

関数file_entity_download_uri()は、Drupal 8.4)には存在しないようで、ファイルのダウンロードURLを作成する必要があります。ファイルの場所を直接公開したくありません。

4
José Trindade

Mediaフィールドを使用している場合は、この目的のためにモジュールを作成しました: http://drupal.org/project/media_entity_download -ファイルを取得します( s)メディアオブジェクトで、すぐにダウンロードURIを提供します。ユーザーには実際のファイルパスは表示されません。

ファイルフィールドしかない場合は、基本的にプライベートファイルオプションの機能を調べています。

最後に、コントローラからのBinaryFileResponseを保証するソリューションが必要です。 私のモジュールの例を見ることができます

3
Kevin

メディアを使用している場合、このコードはあなたのために働くかもしれません:

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

2
Mohammed ATIFI

/ files dir(/ files/downloads/[filename]を使用することをお勧めします)など、ユーザーにダウンロードさせたい静的ファイルがあるだけの場合。このためのルートとコントローラーを作成します。次に、ルートを介してリンクをブロックにレンダリングします。また、whos送信ハンドラが必要なファイル名でルートを呼び出すフォームを作成することもできます。

これには、ユーザーへの実際のファイルパスは表示されず、ファイル名とサイトからのファイルのみが表示されます http://example.com

また、注:OPの問題のタイトルのためにここに追加しました...「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