Обновление :
Это на самом деле не работает с активированным сжатием, потому что 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'
);
}
Fluid
<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 / тип)
- Extbase форматирует вместо typenum
Примечание: iPhone игнорирует заголовки Content-Disposition (всегда встроенные)
Что касается проблем с выходом, я не проверял его, но с типом страницы он мог бы работать, если бы вы использовали собственный PHPView (StandaloneView?).