web文件下载

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

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);
    }

原文地址:https://www.cnblogs.com/xiaoxiaoMrHuang/p/10790515.html

时间: 2024-11-03 00:00:32

web文件下载的相关文章

【Servlet】java web 文件下载功能实现

需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 [html] view plain copy <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body&

Java Web文件下载

Web文件下载有两种,一种是文件在网站目录下,在浏览器中直接输入文件路径即可下载,如http://www.xxx.com/file.zip.另外一种是文件不在网站目录下或者文件是动态生成的(导出报表或者导出excel等),这种情况需要通过response的OutputStream实现文件的下载.DownloadUtils是一个Java Web文件下载工具类,提供多种静态方法实现文件下载. package com.rhui.util; import java.io.BufferedInputStr

Java Web文件下载1——文件下载实现和乱码处理

文件上传和下载是web开发中常遇到的问题,这几天在做一个项目又用到了文件下载,之前也零零散散记了些笔记,今天来做一下整理.文件上传还有待进一步测试,这里先说一下文件下载. 一.文件下载处理流程 文件下载处理流程其实很清晰,即: 1.根据文件名或者文件路径定位文件,具体的策略主要根据自己的需求,总之需要系统能找到的文件全路径. 2.获取输入流,从目标文件获取输入流. 3.获取输出流,从response中获取输出流. 4.从输入流读入文件,通过输出流输出文件.这是真正的下载执行过程. 5.关闭IO流

java web文件下载功能实现

需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>通过链接下载文件&

web 文件下载

response.reset(); response.setContentType("octets/stream"); response.addHeader("Content-Disposition","attachment;filename=test.xls"); OutputStream os = response.getOutputStream(); // 第一步,创建一个webbook,对应一个Excel文件 HSSFWorkbook w

怎么禁止音乐文件下载?禁止在线试听?

这里说的下载是网页下载.MP3下载,或者音乐在线试听对占用带宽,影响流量到不是很大,但是工作时间听歌,塞耳机貌似在工作制度上有漏洞,所以对于上网行为管理来说,禁止非工作内容的下载,以及在线试听是提高工作效率必不可少的步奏之一. 在封堵策略级别的黑白名单中,新增WEB文件下载黑名单. 2.设置了黑名单以后把需要禁止的音乐格式都可以禁止掉,这样在线试听都可以不用了. 3.如果软件初始版本自带的文件格式不在您的格式当中,可以根据具体情况编辑. 4.这个配置除了可以设置禁止在线试听,如果是流媒体客户端软

怎么禁止网页文件下载?如何根据文件大小禁止?

P2P下载很普遍了,禁止起来也不难,Wfilter产品都可以做到,但是在网络工作中,很多文件网页下载就可以做到,有的文件下载涉局域网上网安全,有的文件下载涉及到局域网网络安全,如何禁止文件下载也是上网管理中不或缺的一部分.现在网页浏览格式很多,很多页面除了有文字,还有图片,动画(flash),这些都属于网页下载,所以WFilter产品中没有一键禁止网页下载,而是采用黑白名单,如果一键全部禁止,那么会导致正常网页浏览中的图片,动画甚至一些脚本文件都无法打开. 在封堵策略级别中的黑白名单里面选择"W

python文件下载

1. 场景描述 刚好总结Java项目的web文件下载(附方案及源码配置),想起python项目也有用到文件下载,就也介绍下吧. 2. 解决方案 使用python的第三方组件Flask来实现文件下载功能. 2.1 真实代码 # -*- coding: utf-8 -*- from flask import Flask, send_from_directory app = Flask(__name__) dirpath = '/home/laowang/result/' @app.route("/&

Python Selenium 文件上传(一)

昨天写了Web 文件下载的ui自动化,下载之后,今天就要写web 文件上传的功能了. 当然从折腾了俩小时才上传成功.下面写一下自己操作的步骤 首先网上说的有很多方法 如 input 标签的最好做了,直接定位到元素,然后再sendKeys("value")即可 <input id="file_name" class="text-1 w255" type="text" readonly="" value=