関数file_entity_download_uri()
は、Drupal 8.4)には存在しないようで、ファイルのダウンロードURLを作成する必要があります。ファイルの場所を直接公開したくありません。
Mediaフィールドを使用している場合は、この目的のためにモジュールを作成しました: http://drupal.org/project/media_entity_download -ファイルを取得します( s)メディアオブジェクトで、すぐにダウンロードURIを提供します。ユーザーには実際のファイルパスは表示されません。
ファイルフィールドしかない場合は、基本的にプライベートファイルオプションの機能を調べています。
最後に、コントローラからのBinaryFileResponse
を保証するソリューションが必要です。 私のモジュールの例を見ることができます 。
メディアを使用している場合、このコードはあなたのために働くかもしれません:
$file = Media::load(your_file_id); $file_uri = $file->field_file->entity->getFileUri(); $file_downloadable_link = file_create_url($file_uri);
/ 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;
}