更新: Content-Length はまだ圧縮されていないサイズを表すため、これは実際には有効化された圧縮では機能しません。eID は回避策として使用できます。実際には、そのための公式の呼び出しさえあります。
eID = "dumpFile" Typo3/sysext/core/Resource/PHP/FileDumpEID.php を参照
ただし、この呼び出しはダウンロードを強制するのではなく、「ダンプ」します。これを修正するためにチケット @ Forge を作成しました (これは受け入れられ、LTS 7 を対象としています): https://forge.typo3.org/issues/67111
古い答え:今のところ、これを達成する最も簡単な方法は次のとおりです。
TypoScript定数
# ASCII "download" in Numbers (4-15-23-14-12-15-1-4) - See http://rumkin.com/tools/cipher/numbers.php
plugin.tx_extensionname.view.formatToPageTypeMapping.download = 4152314121514
TypoScript セットアップ
tx_extensionname_download = PAGE
tx_extensionname_download {
typeNum < plugin.tx_extensionname.view.formatToPageTypeMapping.download
config {
disableAllHeaderCode = 1
xhtml_cleaning = 0
admPanel = 0
debug = 0
no_cache = 1
}
10 = USER
10 {
userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
extensionName = ExtensionName
pluginName = PluginName
vendorName = VENDOR
controller = ControllerName
action = download
view < plugin.tx_extensionname.view
persistence < plugin.tx_extensionname.persistence
settings < plugin.tx_extensionname.settings
}
}
コントローラ アクション
/**
* Download
*
* @param \VENDOR\ExtensionName\Domain\Model\Model $model
* @return void
* @ignorevalidation $model
*/
public function downloadAction($model) {
if ($model->getFile()) {
$model->getFile()->getOriginalResource()->getOriginalFile()->getStorage()->dumpFileContents(
$model->getFile()->getOriginalResource(),
$asDownload = TRUE,
$alternativeFilename = $model->getFile()->getOriginalResource()->getName()
);
exit;
}
$this->throwStatus(
$statusCode = 404,
$statusMessage = 'Not Found'
);
}
体液
<f:link.action controller="ControllerName" pluginName="PluginName" action="download" arguments="{model: '{model.uid}'}" format="download" title="{model.file.originalResource.title}">Download</f:link.action>
利点と他の言及された回答は次のとおりです。
- 適切なヘッダー (mime/type を含む)
- typenum の代わりに Extbase フォーマット
補足: iPhone は Content-Disposition ヘッダーを無視します (常にインライン)
「終了」の問題についてはテストしていませんが、独自の PHPView (StandaloneView?) を使用すると、ページの種類で機能する可能性があります。