javascript - Yi2 使用 SendFile() 下载文件
问题描述
我正在尝试使用 Yii2 提供的内置函数 sendFile() 来允许用户下载文件。但是,这不会实际下载文件。
下面是我的ajax代码
$.ajax({
url: 'https://'+window.location.hostname+'/download',
dataType: "json",
type: 'POST',
data: {name: name},
})
服务器端代码
$filename = "test.txt";
$path = Yii::getAlias('@webroot')."/uploads/test.txt";
Yii::$app->response->sendFile($path, $filename)->send();
//I've also tried variations of the file path and name. E.G:
$filename = "test.txt";
$path = Yii::getAlias('@webroot')."/uploads";
上面提供的代码是我目前用来下载文件的代码。当用户单击下载图标时,将对包含上述逻辑的操作进行 Ajax 调用,从而将该文件发送到用户的浏览器。
进行 Ajax 调用时,服务器返回200
但实际上并不下载文件。相反,响应中是被请求文件的内容。例如,如果用户请求一个包含文本的文件'Hello there!'
,当 Ajax 调用完成时,不会下载任何内容,但服务器响应(通过 FireFox 开发工具可以看到)显示'Hello there!'
.
文件本身没有下载有什么原因吗?
如果我只是导航到另一个选项卡中的 url(让我们说它localhost/downloadFile
),则会调用该操作,打开下载对话框,然后我可以下载文件。
解决方案
首先你必须声明,如果你从控制器操作中返回它,在之后
return
调用没有任何用处,就像下面一样保持它send()
sendFile()
return Yii::$app->response->sendFile($path, $filename);
Ajax 不适用于文件下载,您应该创建一个弹出窗口或简单地使用
window.location.assign('https://'+window.location.hostname+'/download/'+name);
您将看到您当前所在的页面不会更改,并且将触发文件下载对话框。
推荐阅读
- mysql - Docker compose 文件不适用于 Node 应用程序中的 Sequlize 和 Mysql
- maven - Wildfly BOM 不包括 Weld
- html - 用 css 摆脱导航栏周围的空白区域
- c# - dotnet 一次发布多个 csproj
- spring - @RolesAllowed 注释总是用 Keycloak 抛出 403 错误
- c# - 在 ASP.NET Core Razor 页面的发布请求中角色为空
- python - 基于多个文档中的数组进行过滤
- angular - 在 FormArray 子上调用 disable() 会重置脏状态
- python-3.x - socket.gaierror: [Errno -3] 名称解析暂时失败
- storage - 在 STM32H743ZI 上将 ADC 流存储在 µSD 卡上而不会丢失