首页 > 解决方案 > 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),则会调用该操作,打开下载对话框,然后我可以下载文件。

标签: javascriptphpajaxyii2

解决方案


  1. 首先你必须声明,如果你从控制器操作中返回它,在之后return调用没有任何用处,就像下面一样保持它send()sendFile()

     return Yii::$app->response->sendFile($path, $filename);
    
  2. Ajax 不适用于文件下载,您应该创建一个弹出窗口或简单地使用

     window.location.assign('https://'+window.location.hostname+'/download/'+name);
    

您将看到您当前所在的页面不会更改,并且将触发文件下载对话框。


推荐阅读