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!'。


有什么原因不能下载文件本身吗?


如果我只是导航到localhost/downloadFile另一个选项卡中的 url(可以说它的),则会调用该操作,打开下载对话框,然后我可以下载文件。


大话西游666
浏览 521回答 1
1回答

DIEA

你必须做return的第一件事是声明,如果你从控制器动作返回它,则send()在之后没有任何调用的用途sendFile(),只需保持如下所示 return Yii::$app->response->sendFile($path, $filename);Ajax 不适用于文件下载,您应该创建一个弹出窗口或简单地使用 window.location.assign('https://'+window.location.hostname+'/download/'+name);您将看到该页面不会更改您当前所在的页面,并且将触发文件下载对话框。
打开App,查看更多内容
随时随地看视频慕课网APP