October CMS 为响应提供了简单的文件下载功能。为了获得最佳性能,该功能需在 AJAX 框架中选择启用。
要启用文件下载,请在 HTML 表单或按钮标签上包含 data-request-download 属性。以下是下载文件的最小示例。
<button data-request="onExport" data-request-download>
Download
</button>如果 data-request-download="..." 属性在请求触发器上设置,此属性中的文件名将被赋予下载的文件。以下内容将生成一个名为 data.csv 的文件。
<button data-request="onExport" data-request-download="data.csv">
Download Document
</button>若要在新的浏览器窗口中打开文件,通常用于预览 PDF,请将 data-browser-target 属性设置为 _blank。
<button data-request="onExport" data-request-download data-browser-target="_blank">
Open in New Window
</button>当使用 download 属性时,响应可以是一个下载或一个常规 AJAX 更新。
:::
在您的AJAX 处理程序中,您可以返回一个文件下载Response类型,其中download方法接受本地磁盘文件路径。
public function onExport()
{
return Response::download(base_path('app/files/installer.zip'));
}要将字符串转换为可下载的响应而无需将内容写入磁盘,请使用 streamDownload 方法,它接受一个回调函数 (第一个参数) 和一个文件名 (第二个参数)。
public function onExport()
{
return Response::streamDownload(function() {
echo 'CSV Contents...';
}, 'export.csv');
}您也可以使用 存储服务 从媒体库或任何存储引擎下载文件. 使用 Storage facade 和 disk 方法指定磁盘名称 (第一个参数), 然后链式调用 download 方法传入要下载的文件名 (第一个参数).
public function onExport()
{
return Storage::disk('media')->download('archive.zip');
}当处理 模型文件附件,您可以在文件对象上调用 download 方法。
public function onDownload()
{
// ...
return $model->avatar->download();
}下面的例子展示了一个可用于下载模型文件附件的CMS页面,该附件具有自定义文件名。它接收附件的 id 和 disk_name 参数用于验证文件,然后将响应返回给浏览器,该响应带有一个从 file_name 参数(可选)获取的自定义文件名。
## pages/download-file.htm
title = "Download File"
url = "/download-file/:id/:disk_name/:file_name?"
layout = "default"function onStart()
{
$file = System\Models\File::find($this->param('id'));
if (!$file || !$file->isPublic()) {
throw new NotFoundException;
}
if ($file->disk_name !== $this->param('disk_name')) {
throw new NotFoundException;
}
$customFileName = $this->param('file_name');
if ($customFileName) {
$file->file_name = $customFileName;
}
return $file->download();
}您随后可以在 Twig 中使用以下标记链接到此页面,其中 file 变量是 System\Models\File 的一个实例。
{{ 'download-file'|page({
id: file.id,
disk_name: file.disk_name,
file_name: 'my-custom-name.png'
}) }}如果你打算将文件内联显示,例如作为图片,请转而调用
$file->output()方法。