PHP 文件下载 显示进度条
前台调用:js调用:
function downloadfile(id,name,price,curcount_pricelimit){
Date.prototype.Format = function(fmt) { //author: meizz
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
var time = new Date().Format("yyyy-MM-dd-hh-mm-ss");
var fileName = name + "_" + time + ".txt";
//alert(fileName);
window.open("downloadfile.php?fileName=" + fileName+"&id=" + id + "&name=" + name + "&price=" + price+"&curcount_pricelimit="+curcount_pricelimit); //进度条和下载文件,创建标志文件
//$.ajax("download.php?id=" + id + "&name=" + name + "&price=" + price + "&fileName=" + fileName); //生成文件
}
php 调用:
echo "<a style='color:blue' onclick=\"downloadfile(".$values['id'].",'".$values['name']."',".$values['lowest_price'].",".$values['curcount_pricelimit'].")\" href='javascript:viod(0)' target=_blank>下载</a>";
下载文件:download.php
<?php
//下载数据
header('Content-Type:text/html;charset=utf-8');
//$filePath="/minbao/data/amazon/data/";
$filePath = "d:/www/amazon/data/";//此处给出你下载的文件在服务器的什么地方
$crawlId=$_GET['id'];
$price=$_GET['price'];//最低价格
$name=urldecode($_GET['name']);
$name=iconv("utf-8","gb2312",$name);//解决乱码
$time=date("Y-m-d-H-i-s");
//导出sql语句:Select pid,price Into OutFile 'F:/QQPCmgr/Desktop/Data_OutFile.txt' fields terminated by ',' From `t_product`
//导出文件命名格式Crawl_ID_txt;
$fileName=$_GET['fileName'];
//删除文件
if(file_exists($filePath.$fileName)){
unlink($filePath.$fileName);
}
include_once('./mysql.php');
$conndb=new ConnDB();
$str="crawl_id='".$crawlId."' and price>='".$price."' ";
//查询配置好的关键词
$filterSqlStr='';
$sql="select filterword from t_crawl_configuration where id=".$crawlId;
$request=$conndb->queryarr($sql);
if($request){
if(strlen($request[0][0])>0)
$filterSqlStr=" and name NOT REGEXP '".$request[0][0]."' ";
}else{
echo "error";
exit;
}
$sql="select pid,price,name Into OutFile '".$filePath.$fileName."' fields terminated by ',' lines terminated by '\r\n' From `t_product` where ".$str.$filterSqlStr;
//echo $sql;
$request=$conndb->query($sql);
if($request){
/*echo "<script> window.location.href='download.php?id=".$crawlId."&file=".$saveFile."';</script>";*/
}else{
echo "<script> alert('下载失败');</script>";
exit;
}
//删除临时文件
$tmpFiliName=$filePath."tmp".$fileName;//临时标志文件
echo $tmpFiliName;
if(file_exists($tmpFiliName)){
unlink($tmpFiliName);
}
// 此处给出你下载的文件名
// $file = fopen($filePath.$fileName, "r"); //打开文件
// //输入文件标签
// header("Content-type:application/octet-stream ");
// header("Accept-Ranges:bytes ");
// header("Accept-Length: " . filesize($filePath.$fileName));
// header("Content-Disposition: attachment; filename= ".$fileName);
//
// //输出文件内容
// echo fread($file, filesize($filePath . $fileName));
// fclose($file);
?>
进度条:downloadfile.php
<?php
header('Content-Type:text/html;charset=utf-8');
//$filePath="/minbao/data/amazon/data/";
$filePath="d:/www/amazon/data/";
$curcount_pricelimit = $_GET['curcount_pricelimit'];
$fileName = $_GET['fileName'];
$tmpFiliName=$filePath."tmp".$fileName;//临时标志文件 $crawlId=$_GET['id'];
$price=$_GET['price'];//最低价格
$name=urldecode($_GET['name']); //防止执行超时
set_time_limit(0);
//清空并关闭输出缓存
ob_end_clean();
//需要循环的数据
if ($curcount_pricelimit/10000>0){
$totalnumproduct=$curcount_pricelimit/10000;
}else{
$totalnumproduct=10;
}
for($i = 0; $i < $totalnumproduct; $i++)
{
$users[] = $fileName.'_' . $i;
}
//计算数据的长度 $total = count($users);
//显示的进度条长度,单位 px
$width = 500;
//每条记录的操作所占的进度条单位长度
$pix = $width / $total;
//默认开始的进度条百分比
$progress = 0;
?>
<html>
<head>
<title>下载提示</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="./js/jquery-1.8.3.min.js"></script>
<style>
body,div input {
font-family: Tahoma;
font-size: 9pt
}
</style>
<script language="JavaScript">
<!--
function updateProgress(sMsg, iWidth,fsize)
{
//$("#downloaded").innerHTML=fsize+"KB";
//alert(fsize);
document.getElementById("downloaded").innerHTML =fsize+"KB";
document.getElementById("status").innerHTML = sMsg;
document.getElementById("progress").style.width = iWidth + "px";
document.getElementById("percent").innerHTML = parseInt(iWidth / <?php echo $width; ?> * 100) + "%";
}
--> function setDownloaded(fsize) {
fsize=fsize/1024;
fsize=Math.round(fsize*100)/100;
//alert(fsize);
document.getElementById("downloaded").innerHTML =fsize+"KB";
} </script>
</head>
<body> <table border="1" width="300">
<tr>
<td>已经生成</td>
<td><div id="downloaded">0</div></td>
</tr>
</table> <div>
<div style="margin:50px auto; padding: 8px; border: 1px solid gray; background: #EAEAEA; width: <?php echo $width+8; ?>px">
<div style="padding: 0; background-color: white; border: 1px solid navy; width: <?php echo $width; ?>px">
<div id="progress"
style="padding: 0; background-color: #FFCC66; border: 0; width: 0px; text-align: center; height: 16px"></div>
</div>
<div id="status"></div>
<div id="percent"
style="position: relative; top: -30px; text-align: center; font-weight: bold; font-size: 8pt">0%</div>
</div>
<?php echo $tmpFiliName."<br />";
if(!file_exists($tmpFiliName)){
echo "创建文件<br />";
file_put_contents($tmpFiliName,'tmpContent') or die("Unable to open file!");
if(file_exists($tmpFiliName)){
echo "创建成功<br />";
$url="download.php?id=".$crawlId."&name=".$name."&price=".$price."&fileName=".$fileName;
echo $url."<br />";
echo "<script>$.ajax('".$url."');</script>";
}
}else{
echo "临时标志文件已经存在!";
} flush(); //将输出发送给客户端浏览器
$filesize=0;
foreach($users as $user)
{
// 在此处使用空循环模拟较为耗时的操作,实际应用中需将其替换;
// 如果你的操作不耗时,我想你就没必要使用这个脚本了 :)
$cnt=0;
if(file_exists($tmpFiliName)){ if(file_exists($filePath.$fileName)){
$file = fopen($filePath.$fileName, "rb");
if ($file) {
$filesize=filesize($filePath.$fileName);
clearstatcache();
// echo $cnt++."、文件大小:".($filesize/1024)."KB<br>";
echo "<script>setDownloaded($filesize);</script>";//在前台显示已经下载文件大小
}
}
}else{
if(file_exists($filePath.$fileName)){
$file = fopen($filePath.$fileName, "rb");
if ($file) {
$filesize=filesize($filePath.$fileName);
clearstatcache();
// echo $cnt++."、文件大小:".($filesize/1024)."KB<br>";
echo "<script>setDownloaded($filesize);</script>";//在前台显示已经下载文件大小
}
}
break;
}
//for($i=0;$i<1000000;$i++){ //}
flush();
sleep(1);
?>
<script language="JavaScript">
updateProgress("正在生成数据文件 <?php echo $user; ?> ....", <?php echo min($width, intval($progress)); ?>,<?php echo $filesize/1024;?>);
</script>
<?php
flush(); //将输出发送给客户端浏览器,使其可以立即执行服务器端输出的 JavaScript 程序。
$progress += $pix;
} //end foreach ?>
<script language="JavaScript">
//最后将进度条设置成最大值 $width,同时显示操作完成
updateProgress("数据文件生成完成!3秒后启动下载...", <?php echo $width; ?>,<?php echo round($filesize/1024,2);?>);
</script>
<?php
flush();
sleep(3);
?>
<script language="JavaScript">
window.location.href ="downloadfinish.php?filePath=<?php echo $filePath; ?>&fileName=<?php echo $fileName; ?>";
</script>
</script>
<?php
flush();
//删除临时文件
if(file_exists($tmpFiliName)){
unlink($tmpFiliName);
}
?>
</body>
</html>
完成下载:downloadfinish.php
<?php
$filePath=$_GET['filePath'];
$fileName=$_GET['fileName'];
//此处给出你下载的文件名
$file = fopen($filePath.$fileName, "r"); //打开文件
//输入文件标签
header("Content-type:application/octet-stream ");
header("Accept-Ranges:bytes ");
header("Accept-Length: " . filesize($filePath.$fileName));
header("Content-Disposition: attachment; filename= ".$fileName); //输出文件内容
echo fread($file, filesize($filePath . $fileName));
fclose($file);
?>
PHP 文件下载 显示进度条的更多相关文章
- python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver)
先来回顾一下昨天的内容 黏包现象粘包现象的成因 : tcp协议的特点 面向流的 为了保证可靠传输 所以有很多优化的机制 无边界 所有在连接建立的基础上传递的数据之间没有界限 收发消息很有可能不完全相 ...
- 【转】C#中使用aria2c进行下载并显示进度条
[转自] C#中使用aria2c进行下载并显示进度条 - 云平台知识库 - 博客园https://www.cnblogs.com/littlehb/p/5782714.html 正则表达式的生成网站: ...
- 036_python的大文件下载以及进度条展示
复习 1.黏包现象 粘包现象的成因: tcp协议的特点,面向流的,为了保证可靠传输,所以有很多优化的机制. 无边界 所有在连接建立的基础上传递的数据之间没有界限. 收发消息很有可能不完全相等. 缓存机 ...
- 任务栏显示进度条 CreateComObject(CLSID_TaskbarList) as ITaskbarList4
http://www.cnblogs.com/jxsoft/archive/2011/06/02/2067712.html //在任务栏显示 进度条 unit Unit9; interface use ...
- Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)(转)
Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现) 相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦 ...
- WPF下载远程文件,并显示进度条和百分比
WPF下载远程文件,并显示进度条和百分比 1.xaml <ProgressBar HorizontalAlignment="Left" Height="10&quo ...
- (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 ...
- android标题栏(titlebar)显示进度条
在后台线程中执行各种操作(网络连接.大数据存储)的时候,我们希望让客户能看到后台有操作在进行,那么既能有效的提示用户,又不占用当前操作空间,最好的方法就是在标题栏有个进度条. [代码] [Java]代 ...
- ProgressIndicator显示进度条以及一些文字信息
//ProgressIndicator可以显示进度条以及一些文字信息,不过这个属性一般都在cs文件中操作. private void PhoneApplicationPage_Loaded(objec ...
随机推荐
- python cookbook 学习系列(一) python中的装饰器
简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...
- css3圣诞雪景球
本来想多做几个了 无奈最近太忙 于是模仿做了一个在codepen看到的圣诞雪景球 算是送给自己的圣诞礼物 演示地址:http://www.qdfuns.com/notes/26668/d5e177 ...
- Windows Live Writer代码插件整理
以下code插件命名按照 Windows Live Writer 中显示的插件名 1.Source code plug-in(cnblogs官方推荐) 界面: 效果: /** * Returns th ...
- IO流-----写到输出流
输出流:---链接:http://blog.csdn.net/du_minchao/article/details/49045421 /** * 方法名:writeStream * 方法描述:写到输出 ...
- 获取iis网站信息
1.获取网站的url地址 var ht = GetWebPathAndWebName(""); var rootUrl = ht["webaddr"].ToSt ...
- Linux工具入门:make工具与Makefile文件
1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...
- Javascript数值转换(string,int,json)
数值: 在JavaScript中,数值转换一般有三种方式: 一.Number(param)函数:param可以用于任何数据类型 1.1 param是Boolean值,true和false分别转换为1和 ...
- 借助Html制作渐变的网页背景颜色
借助Html制作渐变的网页背景颜色 <html> <head> <title>制作渐变背景</title> <meta http-equiv=&q ...
- express源码剖析1
在通读源码之前,先把一些比较难理解的代码吃透: 1.EventEmitter.prototype mixin(app, EventEmitter.prototype, false); app为一个函数 ...
- java对象与XML相互转化
起因 最近在公司做了一次webservice相关的任务,其中我最敢兴趣的就是webservice接受到XML对应的流以后是如何方便的转化成java对象,而java对象又是如何生成对应的XML的. 目的 ...