我的网页如何在没有点击事件的情况下仅使用JavaScript在我的服务器上下载文件

我的网页如何在没有点击事件的情况下仅使用JavaScript在我的服务器上下载文件,javascript,jquery,browser,download,Javascript,Jquery,Browser,Download,我想将文件从我的web服务器下载到我的internet页面,而不需要真正的人工点击或页面加载事件。将这些事件处理程序放到HTML中似乎相当容易,但我还没有找到一个解决方案,让jQuery或JavaScript可以下载一个包含一两行代码的文件,而不使用人工事件 更多的背景信息,我使用AJAX。用户单击一个按钮,启动AJAX请求,调用PHP文件,执行一些工作并创建一个日志文件。制作日志文件最多需要10分钟,以便可以下载。如果AJAX请求返回时带有某些条件,我希望将该文件下载到浏览器,如果没有,则不希

我想将文件从我的web服务器下载到我的internet页面,而不需要真正的人工点击或页面加载事件。将这些事件处理程序放到HTML中似乎相当容易,但我还没有找到一个解决方案,让jQuery或JavaScript可以下载一个包含一两行代码的文件,而不使用人工事件

更多的背景信息,我使用AJAX。用户单击一个按钮,启动AJAX请求,调用PHP文件,执行一些工作并创建一个日志文件。制作日志文件最多需要10分钟,以便可以下载。如果AJAX请求返回时带有某些条件,我希望将该文件下载到浏览器,如果没有,则不希望它下载任何内容。我想要它,这样用户就可以开始这个过程,去烤蛋糕,回来,看到文件已经下载

$.ajax({
  type: "POST",
  url: "/php/do_work.php",
  data:{'foo':bar},
  dataType: 'text',
  success : function(listen_up) {
    if (listen_up == "hide yo kids") {
      //download file to browser
    } else if (listen_up == "hide yo wife") {
      //do something else
    }
//the rest of the ajax request...
我希望下载通过将文件名放在浏览器窗口的左下角来表示成功,如下图所示:


我也可以使用HTML解决方案,只要它们能够在启动下载之前以某种方式等待AJAX请求完成。我对事件也很满意,只要人类用户不一定是触发事件的人。我也不希望使用比必要的更多的服务器资源,比如轮询,因为我希望服务器能够充分关注日志文件的创建。。。但如果没有其他方法,这将是一个足够的答案。

好的,因此您将需要一个长的轮询循环。请看一看:您必须随着时间的推移反复询问服务器文件是否已完成并准备好下载

您的初始Ajax调用需要立即返回并释放。它的响应基本上只是告诉浏览器Ok,我得到了生成文件的请求

当您的服务器准备好下载文件时,它将通知浏览器您正在轮询的任何路径。然后,您可以触发一些javascript来获取文件并下载它


代替长轮询的另一个选项是WebSocket。这是另一种动物,但本质上是相同的流动。浏览器发出Ajax请求以开始文件创建,或发送websocket消息以执行相同操作。一旦文件准备就绪,服务器将发送一条套接字消息,告诉浏览器启动下载。

另一个简单的解决方案是一旦ajax响应返回。 使用href属性创建锚定标记链接,并下载指向您使用javascript存储文件的位置的属性,并在其上触发单击事件

这就是您应该在ajax成功函数中使用的代码片段:

if (response.condition_is_met) {
    var a = document.createElement ('a');
    a.setAttribute ('href', response.log_file_path);
    a.setAttribute ('download');
    a.click ();
}
如上所述,您可能需要使用长轮询,因为在chrome上,ajax调用允许的最大超时时间是1分钟


稍后还需要运行cronjob来删除旧创建的日志,以保持服务器干净。

这不是所有这些工作的方式。首先,没有浏览器,nada将等待10分钟,等待Ajax调用返回。因此,除非您希望不断向服务器发出Ajax请求以查看文件是否完成,否则您将需要用户交互,这被称为事件。用户为什么要这样做?因为用户单击一个按钮,然后会发生一些非常激烈的处理,所以文件一准备好就会被下载。我想下载它,他们没有任何进一步的互动。我以前见过,所以我知道这是可以做到的。另外,我知道AJAX调用在超过10分钟后返回,因为我在调用的成功部分添加了一个警报,并且在这段时间后仍然会发出警报。出于安全原因,只需单击一下即可将其下载到PC。您可以执行AJax请求并在客户端存储结果,但是用户能够下载的实际最终部分需要由用户进行操作。可能的重复操作非常有效。之后我可能也会删除该元素。很高兴知道: