Javascript Yi2使用SendFile()下载文件

Javascript Yi2使用SendFile()下载文件,javascript,php,ajax,yii2,Javascript,Php,Ajax,Yii2,我试图使用Yii2提供的内置函数sendFile()来允许用户下载文件。但是,这实际上不会下载该文件 下面是我的ajax代码 $.ajax({ url: 'https://'+window.location.hostname+'/download', dataType: "json", type: 'POST', data: {name: name}, }) 服务器端代码 $filename = "test.txt"; $path = Y

我试图使用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
,但实际上并不下载文件。相反,响应中是被请求文件的内容。例如,如果用户请求一个包含文本
“你好!”,当Ajax调用完成时,将不会下载任何内容,但服务器响应(通过FireFox开发工具看到)显示
“您好!”

文件本身没有下载有什么原因吗

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

  • 首先您必须
    返回
    语句,在
    sendFile()
    之后调用
    send()
    没有任何用处,如果您是从控制器操作返回它,请保持如下所示

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

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

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

    如果我没有错,您需要
    返回
    语句。为什么要调用
    ->send()
    只需使用像
    return Yii::$app->response->sendFile($path,$filename)
    这样的命令,并在发送ajax请求的地方添加javascript代码。我已经更新了代码,以包含ajax调用以及您建议的返回语句调整。即使进行了这些更改,我也得到了相同的结果。您不应该更改问题中的原始代码,因为它会误导答案,并且在我向您提出上述建议之前,保持其与您工作代码中的原始代码相同。此外,请看下面的答案谢谢!你说得对,Ajax是这里的主要问题。上述建议行之有效。