更新:实际上,在启用压缩时,这并不起作用,因为Content-Length仍将表示未压缩的大小。实际上可以使用eID作为解决方法,事实上甚至有一个官方调用来完成这个操作:
eID =“dumpFile”请参见typo3/sysext/core/Resource/PHP/FileDumpEID.php
但是,此调用不会强制下载,而是将其“转储”。我已经在Forge上创建了一个票据来修复这个问题(已被接受,并针对LTS 7进行了定位):https://forge.typo3.org/issues/67111
旧答案:截至目前,最简单的方法是:
TypoScript常量
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
}
}
控制器操作
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)
- 使用Extbase格式而不是类型编号
顺便一提:iPhone忽略Content-Disposition头信息(始终内联)
关于“退出”问题,我没有测试过,但如果您使用自己的PHPView(StandaloneView?),则可能会起作用。
application/force-download
这个 MIME 类型,它是一个未被识别的 MIME 类型,会回退到application/octet-stream
,这才是应该使用的正确 MIME 类型。 - Robert Wildling