今天碰到文件下载的一些问题,本着知其然也要知其所以然的精神,站在巨人的肩膀上深入学习和测试了一下,抛砖引玉,现在总结结论如下:

1)标准URL下载方式
可以通过在web页面中嵌入 url超级链接,标准的HTTP GET请求,形如:“http://www.wjj.cc/test.zip” 的方式来下载。对于服务器端web根目录有一个test.zip的文件。不解释了,傻子都明白,看不明白就也没有必要去搞IT了。
说明:此种方法的弊端是完全暴露了文件test.zip的网站路径,而且动态性不够灵活。网上已经很多资料,不多说了。

2)通过服务器端脚本向浏览器方(stdout)输出二进制流的方式下载。比如 html页面中嵌入URL为:http://www.wjj.cc/download.php&f=test.zip ,此方法是GET方式请求,URL完全可以获取到。
说明:上述方法可以在服务器端 通过 脚本程序 download.php ,并且根据传入的查询字符串f=test.zip定位服务器上文件系统test.zip的路径,然后按二进制流的方式发送给客户端浏览器,那么客户端浏览器就会弹出一个“下载对话框”了。
另一种方式是通过 提交表单,用POST方式提交参数到服务器端动态脚本,然后服务器端脚本返回输出的二进制流到浏览器实现下载。尤其是当需要下载的文件(可能不一定是服务器上文件系统中具体的文件,有可能是服务器动态生成的数据) 依赖于客户端提交的很多参数选项的时候,采用POST下载的方式是最多的。

下面重点讲述通过动态脚本实现下载的一些例子,下面的例子中均没有给出服务器端动态脚本的处理代码:

1. GET URL下载链接,可以直接嵌入到 <a href="URL...">下载</a> 。
2. POST的URL下载链接,可以通过设置<form>表单的action 以及 表单元素值来完成下载
3. 如果是GET方式的url下载链接,客户端可以通过一个动态生成的隐藏的iframe来得到下载的二进制文件。原理是:iframe有一个src属性,其本质就是发送http请求,GET一个页面或者数据。javascript如下:
function download(){
            var IFrameRequest=document.createElement("iframe");
            IFrameRequest.id="IFrameRequest";
            IFrameRequest.src="/test.zip";
            IFrameRequest.style.display="none";
            document.body.appendChild(IFrameRequest);
}

4. 用动态生成的form元素,实现表单提交,开完成下载。注意:此方法不是ajax哦。
参考url:http://www.cnblogs.com/sydeveloper/archive/2013/05/14/3078295.html
要说明的是,这里的原理仅仅是form提交表单,而不是ajax。

由于jQuery的ajax函数、及ajaxSubmit等函数的返回类型(dataType)只有xml、text、json、html等类型,没有“流”类型,故我们要实现ajax下载时,不能够使用相应的ajax函数进行文件下载。

在网上看了一些文章,发现可以通过js生成一个form,用这个form提交参数,并返回“流”类型的数据。在实现过程中,页面也没有进行刷新。

请看实例:

    var form = $("<form>");   //定义一个form表单

form.attr('style','display:none');   //下面为在form表单中添加查询参数

form.attr('target','');

form.attr('method','post');

form.attr('action',"exportSms");

var input1 = $('<input>');

input1.attr('type','hidden');

input1.attr('name','exportPostTime');

input1.attr('value',timeString);

$('body').append(form);  //将表单放置在web中

form.append(input1);   //将查询参数控件提交到表单上

form.submit();   //表单提交

5. 我在Asterisk中实现批量下载录音的js代码和php代码
javascript代码如下
      //批量下载录音
        function batchDownloadRecording(){
            var rows = $('#taskRecords_search').datagrid('getSelections');
            var form = $("<form>");
            form.attr('style','display:none');
            form.attr('target','');
            form.attr('method','post');
            form.attr('action',"index.php?m=SystemReport&a=batchDownloadRecording");
            $('body').append(form);
            //构建表单
            var rows = $('#taskRecords_search').datagrid('getSelections');
            for (var i = 0; i < rows.length; i++){
                var input = $('<input>');
                input.attr('type','checkbox');
                //input.attr('name','selectlist');
                input.attr('name','selectlist[]'); //非常重要,这里必须加上[],因为是checkbox表单数组
                input.attr('value',rows[i].userfield);
                //alert(rows[i].userfield);
                input.attr('checked',true);//非常重要,这里一定要选中,否则服务器端收到的是空数组
                form.append(input);
            }
            form.submit();
        }

web服务器端php代码如下
      //批量下载录音
      function batchDownloadRecording(){
        $arrUF = $_POST['selectlist'];
        //dump($arrUF);die;
        $monitorDir = '/var/spool/asterisk/monitor';
        header('HTTP/1.1 200 OK');
        header('Date: ' . date("D M j G:i:s T Y"));
        header('Last-Modified: ' . date("D M j G:i:s T Y"));
        header("Content-Type: application/force-download");
        header("Content-Transfer-Encoding: Binary");
        header("Content-Disposition: attachment;filename=Recording-" .Date('Ymd-His') .".tar.gz");
        $cmd = "cd $monitorDir;tar -zcf - ";
        foreach($arrUF AS $uf){
            $arr = explode("_",$uf);
            $arr = explode(".",$arr[2]);
            $timestamp = $arr[0];
            //要转化成mp3文件
            $wavFile = Date('Y-m',$timestamp) ."/" .Date('d',$timestamp) ."/" .str_replace(".wav",".mp3",$uf);
            //echo $wavFile;die;
            if(file_exists($monitorDir ."/" .$wavFile)){
                $cmd .= $wavFile ." ";
            }
        }
        //echo $cmd;die;
        system($cmd);
    }

web页面实现文件下载的几种方法的更多相关文章

  1. 打印web页面指定区域的三种方法

    本文和大家分享一下web页面实现指定区域打印功能的三种方法,一起来看下吧. 第一种方法:使用CSS 定义一 个.noprint的class,将不打印的内容放入这个class内. 代码如下: <s ...

  2. IIS7.5使用web.config设置伪静态的二种方法

    转自 网上赚钱自学网 .http://www.whosmall.com/post/121 近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两 ...

  3. C#中文件下载的几种方法演示源码

    内容过程,把内容过程比较重要的内容做个珍藏,如下的内容是关于C#中文件下载的几种方法演示的内容,应该是对各朋友有较大好处. using System;using System.Data;using S ...

  4. ASP.net MVC 文件下载的几种方法

      ASP.net MVC 文件下载的几种方法(欢迎讨论) 在ASP.net MVC 中有几种下载文件的方法前提:要下载的文件必须是在服务器目录中的,至于不在web项目server目录中的文件下载我不 ...

  5. 实现网页页面跳转的几种方法(meta标签、js实现、php实现)

    1.meta标签实现 只需在head里加上下面这一句就行了,在当前页面停留0.1秒后跳转到目标页面  代码如下 复制代码 1 <meta http-equiv="refresh&quo ...

  6. js 控制页面跳转的5种方法

    js 控制页面跳转的5种方法 编程式导航: 点击跳转路由,称编程式导航,用js编写代码跳转. History是bom中的 History.back是回退一页 Histiory.go(1)前进一页 Hi ...

  7. Jsp页面跳转和js控制页面跳转的几种方法

    Jsp 页面跳转的几种方法 1. RequestDispatcher.forward() 在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servle ...

  8. HTML 页面跳转的五种方法

    H方法TML 页面跳转的五种方法 下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 <he ...

  9. IIS7.5使用web.config设置伪静态的二种方法(转)

    近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两种方法各有优势:第一种比较灵活,只要把文件拷到根目录下,即可直接显示所有伪静态页面(适用于 ...

随机推荐

  1. 查看crontab运行状态

    cron服务是linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start/sbin/service crond stop/sbin/ ...

  2. 谈谈java做登录那些事(一 分析)

    前言: 最近要给自己的网站模板写一个登陆功能,其他功能已经写了一半了,我觉得可以写个登陆整合一下了. 借鉴博客:https://www.cnblogs.com/moyand/p/9047978.htm ...

  3. RCNN算法的tensorflow实现

    RCNN算法的tensorflow实现 转载自:https://blog.csdn.net/MyJournal/article/details/77841348?locationNum=9&f ...

  4. Platform.Uno介绍

    编者语:Xamarin国内很多人说缺乏可用的实例,我在写书过程中在完善一些常用场景的例子,希望帮到大家.Build 2018结束一周了,善友问我要不要谈谈Xamarin的一些变化,但碍于时间有限一直没 ...

  5. 切割日志(mysql,nginx,php tomcat)使用logrotate

    1.简介 logrotate 程序是一个日志文件管理工具.用来把旧的日志文件删除,并创建新的日志文件,我们把这个过程叫做“转储”.我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 ...

  6. 数据分析---《Python for Data Analysis》学习笔记【01】

    <Python for Data Analysis>一书由Wes Mckinney所著,中文译名是<利用Python进行数据分析>.这里记录一下学习过程,其中有些方法和书中不同 ...

  7. Django admin组件源码流程

    admin 组件 Django 自带的用户后台组件 用于用户便携的操作 admin 组件核心 启动 注册 设计url 启动核心代码 每个app 通过 apps.py 扫描 admin.py 文件 并执 ...

  8. Kubernetes 中的渐进式交付:蓝绿部署和金丝雀部署

    渐进式交付是持续交付的下一步, 它将新版本部署到用户的一个子集,并在将其滚动到全部用户之前对其正确性和性能进行评估, 如果不匹配某些关键指标,则进行回滚. 这里有一些有趣的项目,使得渐进式交付在 Ku ...

  9. php支持大文件上传

    打开php.ini找到 upload_max_filesize . memory_limit . post_max_size 这三个参数! upload_max_filesize = 2G 是上传最大 ...

  10. 部分安卓机型1px边框无法显示解决方法

    实践发现css样式中使用1px solid 在部分安卓机型无法显示. 网上找到解决方案:使用行内样式设置边框.