原理:下载文件时设置一个cookie,客户端利用js间隔性检测cookie,如果检测到则服务端对下载的文件处理完毕,然后通知客户端

http://johnculviner.com/post/2012/03/22/Ajax-like-feature-rich-file-downloads-with-jQuery-File-Download.aspx

下载地址:https://github.com/johnculviner/jquery.fileDownload/blob/master/src/Scripts/jquery.fileDownload.js

/** jQuery File Download Plugin v1.3.3
*
* http://www.johnculviner.com
*
* Copyright (c) 2012 - John Culviner
*
* Licensed under the MIT license:
*   http://www.opensource.org/licenses/mit-license.php*/var $ =jQuery.noConflict();$.extend({//    //$.fileDownload('/path/to/url/', options)//see directly below for possible 'options'fileDownload: function(fileUrl, options) {var defaultFailCallback = function(responseHtml, url) {alert("A file download error has occurred, please try again.");};//provide some reasonable defaults to any unspecified options belowvar settings =$.extend({//            //Requires jQuery UI: provide a message to display to the user when the file download is being prepared before the browser's dialog appears//            preparingMessageHtml: null,//            //Requires jQuery UI: provide a message to display to the user when a file download fails//            failMessageHtml: null,//            //the stock android browser straight up doesn't support file downloads initiated by a non GET: http://code.google.com/p/android/issues/detail?id=1780//specify a message here to display if a user tries with an android browser//if jQuery UI is installed this will be a dialog, otherwise it will be an alert//            androidPostUnsupportedMessageHtml: "Unfortunately your Android browser doesn't support this type of file download. Please try again with a different browser.",//            //Requires jQuery UI: options to pass into jQuery UI Dialog//            dialogOptions: { modal: true},//            //a function to call after a file download dialog/ribbon has appeared//Args://url - the original url attempted//            successCallback: function(url) { },//            //a function to call after a file download dialog/ribbon has appeared//Args://responseHtml    - the html that came back in response to the file download. this won't necessarily come back depending on the browser.//in less than IE9 a cross domain error occurs because 500+ errors cause a cross domain issue due to IE subbing out the//server's error message with a "helpful" IE built in message//url             - the original url attempted//failCallback: defaultFailCallback,//            //the HTTP method to use. Defaults to "GET".//            httpMethod: "GET",//            //if specified will perform a "httpMethod" request to the specified 'fileUrl' using the specified data.//data must be an object (which will be $.param serialized) or already a key=value param string//            data: null,//            //a period in milliseconds to poll to determine if a successful file download has occured or not//            checkInterval: 100,//            //the cookie name to indicate if a file download has occured//            cookieName: "fileDownload",//            //the cookie value for the above name to indicate that a file download has occured//            cookieValue: "true",//            //the cookie path for above name value pair//            cookiePath: "/",//            //the title for the popup second window as a download is processing in the case of a mobile browser//            popupWindowTitle: "Initiating file download...",//            //Functionality to encode HTML entities for a POST, need this if data is an object with properties whose values contains strings with quotation marks.//HTML entity encoding is done by replacing all &,<,>,',",\r,\n characters.//Note that some browsers will POST the string htmlentity-encoded whilst others will decode it before POSTing.//It is recommended that on the server, htmlentity decoding is done irrespective.//            encodeHTMLEntities: true}, options);//Setup mobile browser detection: Partial credit: http://detectmobilebrowser.com/var userAgent = (navigator.userAgent || navigator.vendor ||window.opera).toLowerCase();var isIos = false;                  //has full support of features in iOS 4.0+, uses a new window to accomplish this.var isAndroid = false;              //has full support of GET features in 4.0+ by using a new window. POST will resort to a POST on the current window.var isOtherMobileBrowser = false;   //there is no way to reliably guess here so all other mobile devices will GET and POST to the current window.if (/ip(ad|hone|od)/.test(userAgent)) {isIos= true;}else if (userAgent.indexOf('android') != -1) {isAndroid= true;}else{isOtherMobileBrowser= /avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|playbook|silk|iemobile|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/i.test(userAgent.substr(0, 4));}var httpMethodUpper =settings.httpMethod.toUpperCase();if (isAndroid && httpMethodUpper != "GET") {//the stock android browser straight up doesn't support file downloads initiated by non GET requests: http://code.google.com/p/android/issues/detail?id=1780if($().dialog) {$("<div>").html(settings.androidPostUnsupportedMessageHtml).dialog(settings.dialogOptions);}else{alert(settings.androidPostUnsupportedMessageHtml);}return;}//wire up a jquery dialog to display the preparing message if specifiedvar $preparingDialog = null;if(settings.preparingMessageHtml) {$preparingDialog= $("<div>").html(settings.preparingMessageHtml).dialog(settings.dialogOptions);}var internalCallbacks ={onSuccess:function(url) {//remove the perparing message if it was specifiedif($preparingDialog) {$preparingDialog.dialog('close');};settings.successCallback(url);},onFail:function(responseHtml, url) {//remove the perparing message if it was specifiedif($preparingDialog) {$preparingDialog.dialog('close');};//wire up a jquery dialog to display the fail message if specifiedif(settings.failMessageHtml) {$("<div>").html(settings.failMessageHtml).dialog(settings.dialogOptions);//only run the fallcallback if the developer specified something different than default//otherwise we would see two messages about how the file download failedif (settings.failCallback !=defaultFailCallback) {settings.failCallback(responseHtml, url);}}else{settings.failCallback(responseHtml, url);}}};//make settings.data a param string if it exists and isn't alreadyif (settings.data !== null && typeof settings.data !== "string") {settings.data=$.param(settings.data);}var$iframe,downloadWindow,formDoc,$form;if (httpMethodUpper === "GET") {if (settings.data !== null) {//need to merge any fileUrl params with the data objectvar qsStart = fileUrl.indexOf('?');if (qsStart != -1) {//we have a querystring in the urlif (fileUrl.substring(fileUrl.length - 1) !== "&") {fileUrl= fileUrl + "&";}}else{fileUrl= fileUrl + "?";}fileUrl= fileUrl +settings.data;}if (isIos ||isAndroid) {downloadWindow=window.open(fileUrl);downloadWindow.document.title=settings.popupWindowTitle;window.focus();}else if(isOtherMobileBrowser) {window.location(fileUrl);}else{//create a temporary iframe that is used to request the fileUrl as a GET request$iframe = $("<iframe>").hide().attr("src", fileUrl).appendTo("body");}}else{var formInnerHtml = "";if (settings.data !== null) {$.each(settings.data.replace(/\+/g, ' ').split("&"), function() {var kvp = this.split("=");var key = settings.encodeHTMLEntities ? htmlSpecialCharsEntityEncode(decodeURIComponent(kvp[0])) : decodeURIComponent(kvp[0]);if (!key) return;var value = kvp[1] || '';value= settings.encodeHTMLEntities ? htmlSpecialCharsEntityEncode(decodeURIComponent(kvp[1])) : decodeURIComponent(kvp[1]);formInnerHtml+= '<input type="hidden" name="' + key + '" value="' + value + '" />';});}if(isOtherMobileBrowser) {$form= $("<form>").appendTo("body");$form.hide().attr('method', settings.httpMethod).attr('action', fileUrl).html(formInnerHtml);}else{if(isIos) {downloadWindow= window.open("about:blank");downloadWindow.document.title=settings.popupWindowTitle;formDoc=downloadWindow.document;window.focus();}else{$iframe= $("<iframe style='display: none' src='about:blank'></iframe>").appendTo("body");formDoc=getiframeDocument($iframe);}formDoc.write("<html><head></head><body><form method='" + settings.httpMethod + "' action='" + fileUrl + "'>" + formInnerHtml + "</form>" + settings.popupWindowTitle + "</body></html>");$form= $(formDoc).find('form');}$form.submit();}//check if the file download has completed every checkInterval ms
setTimeout(checkFileDownloadComplete, settings.checkInterval);functioncheckFileDownloadComplete() {//has the cookie been written due to a file download occuring?if (document.cookie.indexOf(settings.cookieName + "=" + settings.cookieValue) != -1) {//execute specified callback
internalCallbacks.onSuccess(fileUrl);//remove the cookie and iframevar date = new Date(1000);document.cookie= settings.cookieName + "=; expires=" + date.toUTCString() + "; path=" +settings.cookiePath;cleanUp(false);return;}//has an error occured?//if neither containers exist below then the file download is occuring on the current windowif (downloadWindow ||$iframe) {//has an error occured?try{varformDoc;if(downloadWindow) {formDoc=downloadWindow.document;}else{formDoc=getiframeDocument($iframe);}if (formDoc && formDoc.body != null && formDoc.body.innerHTML.length > 0) {var isFailure = true;if ($form && $form.length > 0) {var $contents =$(formDoc.body).contents().first();if ($contents.length > 0 && $contents[0] === $form[0]) {isFailure= false;}}if(isFailure) {internalCallbacks.onFail(formDoc.body.innerHTML, fileUrl);cleanUp(true);return;}}}catch(err) {//500 error less than IE9internalCallbacks.onFail('', fileUrl);cleanUp(true);return;}}//keep checking...
setTimeout(checkFileDownloadComplete, settings.checkInterval);}//gets an iframes document in a cross browser compatible mannerfunctiongetiframeDocument($iframe) {var iframeDoc = $iframe[0].contentWindow || $iframe[0].contentDocument;if(iframeDoc.document) {iframeDoc=iframeDoc.document;}returniframeDoc;}functioncleanUp(isFailure) {setTimeout(function() {if(downloadWindow) {if(isAndroid) {downloadWindow.close();}if(isIos) {if(isFailure) {downloadWindow.focus();//ios safari bug doesn't allow a window to be closed unless it is focused
downloadWindow.close();}else{downloadWindow.focus();}}}},0);}functionhtmlSpecialCharsEntityEncode(str) {return str.replace(/&/gm, '&amp;').replace(/\n/gm, "&#10;").replace(/\r/gm, "&#13;").replace(/</gm, '&lt;').replace(/>/gm, '&gt;').replace(/"/gm, '&quot;').replace(/'/gm, '&apos;'); //single quotes just to be safe
}}
});

javascript 检测 header下载文件--插件相关推荐

  1. php header下载中文名称,PHP Header下载文件在IE文件名中文乱码问题

    解决PHP Header下载文件在IE文件名中文乱码有两种常见的,一种是是把页面编码改成utf8,另一种是对中文url进入urlencode编码就可以解决了. 解决方案一,我的页面是utf-8编码,代 ...

  2. 检测selenium下载文件

    方法地址:检测selenium下载文件 selenium使用Chrome下载文件,下载文件的过程如同ajax根本不知道何时下载完成.selenium本身也未提供检测下载是否完成的方方达.没有就自己写个 ...

  3. 利用html的header下载文件

    转载于:https://www.cnblogs.com/passer1991/archive/2012/11/09/2762340.html

  4. java ie下载文件名乱码问题_php中强制下载文件的代码(解决了IE下中文文件名乱码问题)...

    中间遇到一个问题是提交的中文文件名直接放到header里在IE下会变成乱码,解决方法是将文件名先urlencode一下再放入header,如下. $file_name = urlencode($_RE ...

  5. PC端下载文件到本地

    最新更新时间:2021年08月12日14:42:40 <猛戳-查看我的博客地图-总有你意想不到的惊喜> 本文内容:前端开发过程中,经常会遇到下载文件到本地的需求,用户点击一个按钮,浏览器会 ...

  6. ajax实现下载文件进度条及方法详解

    javascript使用ajax下载文件进度条实现 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&qu ...

  7. php强制下载压缩包损坏,php 通过header下载中文文件名 压缩包损坏或文件不存在的问题...

    开发中大家都是使用的utf8编码,昨天遇到一个奇坑,本是一件很小的问题,解决也浪费了个吧小时.废话不多说,植入正题: 文件下载方式:通过header二进制流文件下载 需求: 文件上传保留文件名不变 数 ...

  8. 使用Javascript / jQuery下载文件

    本文翻译自:Download File Using Javascript/jQuery I have a very similar requirement specified here . 我在这里指 ...

  9. js下载文件,javascript下载文件,FileSaver.js,页面元素保存成文件

    js下载文件,javascript下载文件,FileSaver.js,页面元素保存成文件 ================================ ©Copyright 蕃薯耀 2020-07 ...

最新文章

  1. STM32F2系列系统时钟默认配置
  2. Web服务器面临的五种应用层DOS威胁
  3. source insight3.5显示中文_Doxygen 中文文档
  4. AI 开发者如何摆脱只有“人工”没有“智能?
  5. 处理得怎么样填空词语_武都网络推广软件效果怎么样【易商网络】
  6. Windows令牌窃取提权和烂土豆提权学习
  7. 自建服务器解网络锁,掌握iPhone1-4代刷机技巧
  8. VBA函数传递参数方式
  9. 小米5刷android p6,小米5刷recovery教程 小米5第三方recovery下载
  10. iOS 常见的六种 手势
  11. FANUC机器人示教器介绍
  12. 解析ARM中OS_CPU_A.S(中断级方式)
  13. POJ 1318 Word Amalgamation G++
  14. 函数指针的作用:*visit函数
  15. O - 鸣人和佐助(BFS)
  16. SumGNN部署实验lmdb.ReadonlyError: mdb_dbi_open: Permission denied
  17. From little Cutie to Rockin Beauty(about Hilary Duff and someone concerned.)
  18. 计算机网络考试多选题汇总Ⅰ(答案见文末)
  19. 【STM32F407】第4章 RTX5操作系统移植(MDK AC5)
  20. AD17入门简单教程(二)

热门文章

  1. 批处理解决本地连接无法禁用问题
  2. 对于U盘做系统,win8降级到win7系统的心得体会
  3. this Activity.this Activity.class
  4. 解决mysql-5.5导入数据报错
  5. IP BASE对OSPF的支持版本
  6. 一个学机械的毕业生令中国人无法安眠的帖子
  7. java基础-数据类型
  8. 数据库历险记(二) | Redis 和 Mecached 到底哪个好?
  9. js_Event Loop(笔记)
  10. RAC修改数据库的spfile位置