Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测用户何时接受下载文件_Javascript_Browser_Download - Fatal编程技术网

Javascript 检测用户何时接受下载文件

Javascript 检测用户何时接受下载文件,javascript,browser,download,Javascript,Browser,Download,我想在用户单击允许他们下载文件的超链接后将其重定向到其他网页。但是,因为他们需要在“打开/保存文件”对话框中进行选择,所以在他们接受下载之前,我不想重定向他们 我如何才能检测到他们执行了此操作?请尝试以下操作: <html> <head> <script type="text/javascript"> function Confirmation(pg) { var res = confirm("Do you want to downlo

我想在用户单击允许他们下载文件的超链接后将其重定向到其他网页。但是,因为他们需要在“打开/保存文件”对话框中进行选择,所以在他们接受下载之前,我不想重定向他们

我如何才能检测到他们执行了此操作?

请尝试以下操作:

<html>
<head>
<script type="text/javascript">
    function Confirmation(pg) {
        var res = confirm("Do you want to download?");
        if(res){
            window.open(pg,"_blank");
        }
        return res;
    }
</script>
</head>
<body>
  <a href="http://yoursite/download.zip" onclick="return Confirmation('http://yoursite/redirect.html');">download</a>
</body>
</html>

功能确认(pg){
var res=确认(“您想下载吗?”);
如果(res){
窗口打开(页面空白);
}
返回res;
}

jquery.fileDownload允许您执行以下操作:

$(document).on("click", "a.fileDownloadPromise", function () {
    $.fileDownload($(this).prop('href'))
        .done(function () { alert('File download a success!'); })
        .fail(function () { alert('File download failed!'); });

    return false; 
});
看看Github:


考虑到用户已经知道或应该知道文件应该在流程的下一步之前下载,用户应该希望能够以某种形式确认文件已经下载

您可以使用
创建一个唯一的标识符或时间戳,以包含在下载的文件名中

如果从用户文件系统中选择的文件等于修改后的下载文件名,则调用函数,否则通知用户尚未确认文件下载

window.addEventListener(“加载”,函数(){
让id、文件名、url、文件;
让确认=假;
常量a=document.querySelector(“a”);
const button=document.querySelector(“按钮”);
const confirm=document.querySelector(“输入[type=file]”);
常量标签=document.querySelector(“标签”);
函数confirmDownload(文件名){
如果(已确认){
filename=filename.replace(/(-\d+/,“”);
label.innerHTML=“下载“+文件名+”已确认”;
}否则{
确认=错误;
label.innerHTML=“下载未确认”;
}
revokeObjectURL(URL);
id=url=filename=void 0;
如果(!file.isClosed){
file.close()文件
}
}
函数handleAnchor(事件){
确认。单击();
label.innerHTML=“”;
confirm.value=“”;
window.addEventListener(“焦点”,handleCancelledDownloadConfirmation);
}
函数句柄文件(事件){
if(confirm.files.length&&confirm.files[0].name==文件名){
确认=正确;
}否则{
确认=错误;
}
确认下载(文件名);
}
函数handleDownload(事件){
//文件
file=新文件([“abc”],“file.txt”{
键入:“文本/普通”,
lastModified:new Date().getTime()
});
id=新日期().getTime();
filename=file.name.match(/[^.]+/g);
filename=filename.slice(0,filename.length-1).join(“”)
.concat(“-”,id,“.”,文件名[filename.length-1]);
file=新文件([file],文件名{
type:file.type,
最后修改:id
});
a、 下载=文件名;
url=url.createObjectURL(文件);
a、 href=url;
警报(“保存文件后确认下载”);
a、 单击();
}
函数handleCancelledDownloadConfirmation(事件){
if(confirm==false&&!confirm.files.length){
确认下载(文件名);
}
window.removeEventListener(“焦点”,handleCancelledDownloadConfirmation);
}
a、 addEventListener(“单击”,手动);
确认。添加监听器(“更改”,handleFile);
按钮。addEventListener(“单击”,处理下载);
});
下载文件
下载文件

正如我在多年的维护中发现的那样,根本无法从JS(或一般情况下,请参见下文)判断用户选择如何使用下载打开/保存对话框。这是一个常见的功能要求,多年来我一直在反复研究它。我可以自信地说这是不可能的;如果有人能演示一种机械的方法来确定任何文件上的后提示用户操作,我将乐意支付10倍的奖金

此外,这不仅仅是JS规则的问题,浏览器下载和提示此类文件的方式使问题变得复杂。这意味着,即使是服务器也不能总是知道发生了什么。对于一些特定的案例,可能会有一些具体的解决方法,但它们并不漂亮或简单

您可以使用
强制用户“重新上传”下载的文件以验证它,但这充其量也很麻烦,而且本地文件浏览对话框可能会让某些人感到不安。它是确保下载的唯一可靠方法,但对于非敏感应用程序来说,它非常苛刻,而且在一些缺乏文件支持的“移动”平台上也不起作用

您还可以尝试从服务器端监视,将文件在服务器上被命中的消息推送到客户端。这里的问题是,下载会在打开/保存对话框出现时立即开始下载,尽管在后台是看不见的。这就是为什么如果你等待片刻来“接受”一个大文件,它一开始似乎下载得很快。从服务器的角度来看,无论用户做什么,活动都是相同的

对于一个大文件,您可能会检测到整个文件未被传输,这意味着用户单击了“取消”,但将状态从后端推送到客户端是一个复杂的同步过程。它需要大量的自定义编程,包括套接字、PHP消息传递、EventSource等,但收效甚微。这也是一场与时间的竞赛,而且时间的长短不确定;为了让用户满意,不建议放慢下载速度

如果它是一个小文件,它将在用户看到对话框之前进行物理下载,因此服务器将毫无用处。还考虑到一些下载管理器扩展接管了作业,并且它们不能保证与香草浏览器的行为相同。强迫等待对于一个硬盘速度慢,需要“永远”才能“完成”下载的人来说是危险的;我们都经历过这种情况,说得委婉一点,当“spinny”关闭时,如果不能继续下去,会降低用户满意度

简言之,没有简单的方法,一般来说也没有方法,除非你知道巨大的文件需要很长时间才能保存下来