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 ...
随机推荐
- knockout学习笔记10:demo
前面已经介绍了ko的基本用法,结合官方文档,基本就可以实际应用了.本章作为ko学习的最后一篇,实现一个简单的demo.主要集中在ko,所以后台数据都是静态的.类似于博园,有一个个人文章的分类列表,一个 ...
- Codeforces Round #382(div 2)
A.= = B. 题意:给出n个数和n1和n2,从n个数中分别选出n1,n2个数来,得到n1个数和n2个数的平均值,求这两个平均值的最大和 分析:排个序从后面抽,注意先从末尾抽个数小的,再抽个数大的 ...
- QinQ
7.3.1 QinQ技术诞生的背景 --<华为交换机学习指南> QinQ最初主要是为扩展VLAN ID空间而产生的,但随着城域以太网的发展以及运营商精细化运作的要求,QinQ的双层标签又有 ...
- python学习之路 第四天
1.函数动态参数: #!/usr/bin/env python3 def show(*sss,**eee): print(sss,type(sss)) prin ...
- HV000030: No validator could be found for type: java.lang.Integer.
在写接口时,一般去查找在类的Integer属性上加了不属于整型的校验,比如@NotEmpty,@Length等 @JSONField(name = "deviceNum") @No ...
- Redux原理(一):Store实现分析
写在前面 写React也有段时间了,一直也是用Redux管理数据流,最近正好有时间分析下源码,一方面希望对Redux有一些理论上的认识:另一方面也学习下框架编程的思维方式. Redux如何管理stat ...
- 解决vs崩溃 无法打开工程 新建工程显示未找到约束
一般是因为windows更新引起的,可以删除与.net framework有关的更新补丁如果补丁太多可以试试如下方法: 解决方法: 1.关闭VS: 2.去C:/Users/<your users ...
- react 表单
import React ,{PropTypes}from 'react'; import { render } from 'react-dom'; const styles={ mb10:{ mar ...
- volatile关键字 学习记录2
public class VolatileTest2 implements Runnable{ volatile int resource = 0; public static void main(S ...
- 脚本工具(获取某个文件夹下的所有图片属性批量生成css样式)
问题描述: 由于有一次工作原因,就是将某个文件夹下的所有图片,通过CSS描述他们的属性,用的时候就可以直接引用.但是我觉得那个文件夹下的图片太多,而且CSS文件的格式又有一定的规律,所有想通过脚本来生 ...