Maison  >  Article  >  développement back-end  >  L'idée de faire en sorte que PHP télécharge des fichiers avec progrès

L'idée de faire en sorte que PHP télécharge des fichiers avec progrès

墨辰丷
墨辰丷original
2018-06-06 15:05:021099parcourir

Cet article présente principalement l'idée de​​faire en sorte que des fichiers PHP soient téléchargés avec des progrès. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Le téléchargement progressif de gros fichiers PHP a toujours été un problème qui trouble les programmeurs PHP. Interrogez Baidu et Google, et la méthode générale de téléchargement avec progression est : flash+php, socket, apc+php, etc. Ci-dessous, je présente le téléchargement avec progression produit par apc +php+ajax, et post C'est le code source, j'espère qu'il sera utile à tout le monde.
Alternative PHP Cache (APC) est un cache de code optimisé gratuit et public pour PHP. Il est utilisé pour fournir un cadre gratuit, ouvert et robuste pour la mise en cache et l'optimisation du code intermédiaire PHP.

Lorsque vous utilisez apc, vous devez d'abord installer le module apc.
Étape 1 : Téléchargez php_apc.dll

Étape 2 : Faites en sorte que php.ini prenne en charge le module d'extension apc. Mettez php_apc.dll dans votre répertoire ext, puis ouvrez php.ini et ajoutez :
extension=php_apc.dll
apc.rfc1867 = on
apc . max_file_size = 100M
upload_max_filesize = 100M
post_max_size = 100M
//Les paramètres ci-dessus peuvent être définis par vous-même

Étape 3 : Vérifier si PHP APC est supporté

 if (function_exists('apc_fetch')) {
 echo 'it surpport apc model!';
 } else {
 echo "it's not support apc model!";
 }
 ?>

Entrons dans le vif du sujet : Principe : Par le module APC, utilisez Ajas pour lire la progression du téléchargement à partir du cache. Pour plus de détails, voir :
index.php

<?php
 $unid=uniqid("");//确定唯一标致,实现多人同时上传
?>
<p class="userinput2">
 <p id="captions">先将你要上传的软件上传服务器,上传时请耐心等候...<span class="style1"><br />
 </span>
 <script type="text/javascript" >
 var xmlHttp;
 var proNum=0;
 var loop=0;
 //初始化xmlHttp
 function createxml(){
 var xmlHttp;
 if(window.XMLHttpRequest){
 xmlHttp=new XMLHttpRequest();
 }else{
 xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
 }
 return xmlHttp;
 }
 xmlHttp=createxml();
 //ajas操作
 function sendURL() {
 var url="getprogress.php?progress_key=<?php echo $unid;?>";
 xmlHttp.open("GET",url,false);
 if (window.navigator.userAgent.indexOf("Firefox")>=1){
 //如果是firefox3.0
 xmlHttp.send("progress_key=<?php echo $unid;?>");
 if(xmlHttp.status==200) doHttpReadyStateChange();
 
 }else{
 xmlHttp.onreadystatechange = doHttpReadyStateChange;
 xmlHttp.send("progress_key=<?php echo $unid;?>");
 }
 }
 //回调函数
 function doHttpReadyStateChange() {
 if (xmlHttp.readyState== 4){
 proNum=parseInt(xmlHttp.responseText);
 //alert(proNum);
 document.getElementByIdx_x("progressinner").style.width = proNum+"%";
 document.getElementByIdx_x("showNum").innerHTML = proNum+"%";
 if ( proNum < 100){
 setTimeout("sendURL()", 200);
 }else{
 //上传成功后,还不能及时得到信息。还希望高人指点
 document.getElementByIdx_x("progressouter").style.display="none";
 document.getElementByIdx_x("progressinner").style.display="none";
 document.getElementByIdx_x("showNum").style.display="none";
 document.getElementByIdx_x("theframe").style.display="none";
 document.getElementByIdx_x("link2").style.display="block";
 }
 
 }
 }
 function startProgress(){
 document.getElementByIdx_x("progressouter").style.display="block";
 setTimeout("sendURL()", 200);
 }
 function newsofturl(text){
 document.getElementByIdx_x("link2").style.display="block";
 document.getElementByIdx_x("link2").value=text;
 }
 </script>
 <iframe id="theframe" name="theframe" src="softupload.php?id=<?php echo($unid); ?>" style="border: 0; height: 80px; width: 400px; " frameborder="0" scrolling="no" > </iframe>
 <input name="linkdefult" type="hidden" id="linkdefult" value="0" />
 <br />
 <p id="link2" style="display:none;" > <font size=2>上传成功!    文件大小为:
 <input type="text" name="filesize" id="filesize" style="width:50px;"/>
 </font><br>
 <br>
 <font size=2>文件下载地址为:</font><br />
 <input type=text name=&#39;link&#39; id=&#39;link&#39; style=&#39;width:380px;&#39; />
 </p>
 <br/>
 <p id="progressouter" style="width: 500px; height: 20px; border: 1px solid #000000; display:none;">
 <p id="progressinner" style="position: relative; height: 20px; background-color: #333333; width: 0%; "></p>
 </p>
 <p id=&#39;showNum&#39; style="font-size:12px; color:#333333"></p>
 </p>
</p>

softupload.php

<?php
 $id = $_GET[&#39;id&#39;];
?>
<script language="javascript">
//Trim the input text
function Trim(input)
{
 var lre = /^\s*/;
 var rre = /\s*$/;
 input = input.replace(lre, "");
 input = input.replace(rre, "");
 return input;
 }
function CheckForTestFile()
 {
 var file = document.getElementByIdx_x(&#39;Softfile&#39;);
 var fileName=file.value; 
 //Checking for file browsed or not
 if (Trim(fileName) ==&#39;&#39; )
 {
 alert("请为上传选择一个文件!!!");
 file.focus();
 return false;
 }
 //Setting the extension array for diff. type of text files
 var extArray = new Array(".rar", ".zip", ".exe", ".gz"); 
 //getting the file name
 while (fileName.indexOf("\") != -1)
 fileName = fileName.slice(fileName.indexOf("\") + 1);

 //Getting the file extension  
 var ext = fileName.slice(fileName.indexOf(".")).toLowerCase();
 for (var i = 0; i < extArray.length; i++)
 {
 if (extArray[i] == ext)
 {
 window.parent.startProgress(); return true;
 }
 }
 alert("正确的文件格式为" + (extArray.join(" ")) + "\n请选择一个新的 " + "文件提交上传.");
 file.focus();
 return false; 
 } 
</script> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<form enctype="multipart/form-data" id="upload_form" action="target.php" method="POST">
<input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="<?php echo $id?>"/>
<table width="322" border="0" cellpadding="0" cellspacing="0" id="linkTable">

 <tr>
 <td >1.选择软件<br />

 <input name="Softfile" type="file" id="Softfile" /></td>
 <td ><br />
 <input name="submit" type="submit" onclick="return CheckForTestFile();" value="上传软件"/></td>
 </tr>
 </table>
</form>

target.php

<script language="javascript">
//将上传后的信息返还给父窗口
function chuanzhi(){
parent.document.getElementByIdx_x(&#39;filesize&#39;).value=document.getElementByIdx_x(&#39;size&#39;).value;
parent.document.getElementByIdx_x(&#39;link&#39;).value=document.getElementByIdx_x(&#39;newsoftdir&#39;).value;
parent.document.getElementByIdx_x(&#39;linkdefult&#39;).value=1;
}
</script>
<body onLoad="chuanzhi();">
<?php
//header(&#39;Content-Type:text/html;charset=gb2312&#39;);
define(&#39;SOFTDIR&#39;, "./upload/"); //上传后路径
define(&#39;HTTPSOFTDIR&#39;, "http://www.mysite.com/"); //服务器的路径

//判断上传软件后缀名是否允许
function isSoftExt($extension) {
 $ext = array(&#39;exe&#39;, &#39;rar&#39;, &#39;zip&#39;,&#39;gz&#39;);
 return in_array($extension, $ext) ? true : false;
}
if($_SERVER[&#39;REQUEST_METHOD&#39;]==&#39;POST&#39;){
$errors[&#39;0&#39;] = true;
$errors[&#39;1&#39;] = &#39;请选择上传的软件图片&#39;;
$errors[&#39;2&#39;] = &#39;上传软件图片失败&#39;;
$errors[&#39;3&#39;] = &#39;上传软件图片失败&#39;;
$daytime = date(&#39;Y-m-d-h-m-s&#39;);
$timename=str_replace("-","",$daytime); //取得当天的日期时间


 //检查软件是否是正常上传的
 if(!is_uploaded_file($_FILES[&#39;Softfile&#39;][&#39;tmp_name&#39;])) {
 echo "<script>alert(&#39;非正常上传!&#39;);history.back();</script>";
 exit;
 }
 $extension = pathinfo($_FILES[&#39;Softfile&#39;][&#39;name&#39;], PATHINFO_EXTENSION);
 $filename = $timename."_".$_FILES[&#39;Softfile&#39;][&#39;name&#39;];
 $tmpsize=$_FILES[&#39;Softfile&#39;][&#39;size&#39;];
 $msize=round($tmpsize/1048576 , 2) ."M";
 $ksize=round($tmpsize/1024 ,2). "K";
 $filesize =$tmpsize>1048576?$msize:$ksize;
 //检查软件文件格式
 if(!isSoftExt($extension)) {
 echo "<script>alert(&#39;上传的软件格式有错误!&#39;);history.back();</script>";
 exit;
 } 
 //移动软件
 if(!move_uploaded_file($_FILES[&#39;Softfile&#39;][&#39;tmp_name&#39;], SOFTDIR. $filename)) {
 echo "<script>alert(&#39;移动软件出错!&#39;);history.back();</script>";
 exit;
 }else{
 echo "<font size=2>上传成功!    文件大小为:<input type=text id=&#39;size&#39; value=&#39;$filesize&#39;></font><br>";
 echo "<font size=2>文件下载地址为:</font><input type=text id=&#39;newsoftdir&#39; value=&#39;".HTTPSOFTDIR.$filename."&#39; style=&#39;width=380&#39;>";
 }
}else
echo "请不要直接输入地址!";

?>

getprogress.php

<?php
//上传ajas获取进度页面
session_start();
if(isset($_GET[&#39;progress_key&#39;])) {
 $status = apc_fetch(&#39;upload_&#39;.$_GET[&#39;progress_key&#39;]);
 echo ($status[&#39;current&#39;]/$status[&#39;total&#39;])*100;
}
echo &#39;APC_FILE=&#39;.APC_FILE;
?>

Résumé : Ce qui précède est l'intégralité du contenu de cet article, j'espère qu'il sera utile à tout le monde étude.

Recommandations associées :

Méthodes de traitement des transactions et exemple d'analyse de PDO en PHP

Résolution du conflit entre __autoload et Smarty en PHP Explication détaillée de la méthode

Solution et exemples de problème tronqué en PHP utilisant PDO pour faire fonctionner la base de données

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn