php文件上傳下載實例(實現最簡單的網盤功能)

本人是一個新手代碼狗,第一次發表博客,歡迎大大們指點!php

最近手頭有一個文件上傳下載的案例,跟你們一塊兒分享一下做爲一個新手的苦逼成長曆程!html

話很少說,先上代碼:linux

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        請選擇小於200KB的gif/png/jpg文件:<br/>
        <form action="piliangfile.php" method="post" enctype="multipart/form-data">
        <input type="file" name="file[]" multiple="multiple"/><br/>   <!--multiple="multiple",可批量上傳,使用鼠標或鍵盤拖選多個文件; --> 
        <input type="submit" value="確認上傳"/>
        </form>
    </body>
</html>

一:這個是一個文件上傳的html頁面,小博作的是上傳圖片(gif、png和jpg格式,200KB之內);windows

初稿作的是單一上傳,後來改爲的批量上傳,在input中將name的名字從file改爲file[],而後加上multiple=「multiple」就能夠了(選擇上傳文件時可使用鼠標或者鍵盤進行批量選擇);數組

其實一開始小博是傻傻的用了N個input框進行上傳的!= =。瀏覽器

 

二:圖片的後臺處理;app

<?php
header("content-type:text/html;charset=utf-8");
error_reporting(E_ALL^E_NOTICE);

if(!file_exists("./pic"))  //若是不存在該文件夾,則新建文件夾
{
    mkdir("./pic");
}
    $file=$_FILES['file'];//獲取傳輸文件數組;

    foreach($file["name"] as $valuename){   //遍歷文件['name數組'];獲得字符串:1.png.2.png.3.png.;
           $value.=$valuename.".";        
    };
    
     $strr=substr($value,0,strlen($value)-1);   //字符串更新:1.png.2.png.3.png(去掉最後一個.);
     
     $strarr=explode(".", $strr);     //得到數組如:arr(1,png,2,png,3,png,4,png);
     
     $filetypearr=[];
     foreach($strarr as $key=>$valuea){
         if($valuea!=""){                         //去掉上傳過來的空值;
             if($key%2!=0){               
             $filetypearr[]=$valuea;             //得到新數組,如:arr(png,png,png);
         }
         }         
     }                           
                 
    $typearr=array("png","jpg","gif");   //可上傳類型數組
     
    function checktype($typearr,$type){   //判斷類型方法;
    foreach($typearr as $value){
        if($value==$type){
            return true;
        }
    }
    return false;
}
    
foreach($filetypearr as $key=>$valueb){        //判斷格式類型是否正確;
    if(!checktype($typearr,$valueb)){
        echo "<script language='JavaScript'>alert('文件格式不正確')</script>";
        header("Refresh:0.1;url=piliangfile.html");
        exit;
    }
}         
    for($i=0;$i<count($file['name']);$i++){
        $file['name'][$i]=iconv("utf-8","gb2312",$file['name'][$i]);
    if($file['size'][$i]>1024*200){                //判斷文件大小是否符合,若是文件過大會提示該文件,符合的文件會繼續上傳,不符合的文件不上傳;
        echo "<script language='JavaScript'>alert('文件名爲".$file['name'][$i]."的文件過大')</script>";
        header("Refresh:0.1;url=picscan.php");        
    }else{                                          //存儲文件,並跳轉到文件展現頁面;
        move_uploaded_file($file['tmp_name'][$i], "pic/".$file["name"][$i]);
        header("Refresh:0.1;url=picscan.php");
    }            
}        
    ?>

小博在實際過程當中對於文件名符合類型可是大小過大的文件實行攔截,其餘符合的會先一步上傳。(可是若是上傳的文件類型中有不符合的,批量上傳會中斷,沒有文件上傳);post

三:文件展現頁面(主頁面)this

<?php
header("content-type:text/html;charset=utf-8");
$picarr=scandir("./pic");   //獲取文件夾內的全部文件;
ini_set('date.timezone','Asia/Shanghai'); //時區設置,東八區上海時間;
function format_bytes($size) {             //文件大小轉換方法(字節轉換爲KB,MB,GB,TB);
$units = array(' B', ' KB', ' MB', ' GB', ' TB');
for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;
return round($size, 2).$units[$i];
}  
?>
<form action='picloadall.php' method='post'>
<table border="1" width="1000" align="center">
        <tr>
        <td>序號</td>
        <td>文件名</td>
        <td>圖片</td>
        <td>大小</td>
        <td>最後修改時間</td>
        <td>全選<input id="all" type="checkbox"/><input type='submit' name='delete' value="刪除"><input type='submit' name="download" value="單張下載"><input type='submit' name="downloadall" value="批量下載"><input type="button" onclick="window.location=('piliangfile.html')" value="上傳"></td>        
        </tr>
<?php
    foreach($picarr as $key=>$value){
        if($key>1){                        //去掉前面的兩個空值;
    echo "<tr>";
    echo "<td>".($key-1)."</td>";               //序號
    echo "<td>".$value."</td>";                  //文件名
    echo "<td><img src='pic/".$value."' width='200' height='100'/></td>";  //圖片
    echo "<td>".format_bytes(filesize("pic/$value"))."</td>";                             //filesize 獲取文件大小(單位:B); 
    echo "<td>".date("Y-m-d H:i:s", filemtime("pic/$value"))."</td>";               //filemtime  獲取文件最後修改時間(單位:毫秒) date轉換時間
    echo "<td><input type='checkbox' name='del[]' value='".$value."'/></td>";    //多選框傳值(傳的是文件名)    
    echo "</tr>";
        }            
    }    
    
?>        
</form>
</table>
<script language="JavaScript">
function chooseall(str){                                           //全選方法
    var cholen=document.getElementsByName('del[]').length;
    for(i=0;i<=cholen;i++){
        document.getElementsByName('del[]')[i].checked=str;
    }
}
    document.getElementById("all").onclick=function(){              //全選事件
        if(this.checked==true){
            chooseall(true);
        }else{
            chooseall(false);
        }
        
    }
</script>

四:刪除與下載後臺處理頁面url

<?php
error_reporting(E_ALL^E_NOTICE);
 if ( $_REQUEST['delete'] ) {   //一個表單多個提交按鈕,區分提交按鈕的name值;
     
   $picname=$_POST['del'];
     
    foreach($picname as $value){
        
        unlink("pic/$value");          //刪除對應的文件;
    }         
    } else if($_REQUEST['download']){
        
    $picname=$_POST['del'];                    
    if($picname!=''){                     //去掉空值的狀況(沒有選中任何項,無表單傳值)
    foreach($picname as $value){
    if(!file_exists("pic/$value")){        //沒有該文件時沒法下載;
        echo "<script language='JavaScript'>alert('沒有該文件,沒法下載')</script>";
        header("location:picscan.php");
    }else{
        $fp=fopen("pic/$value","r");               //打開文件指針;
        $file_size=filesize("pic/$value");         //文件的大小;   
        Header("Content-type: application/octet-stream");  //告知瀏覽器下載的文件類型;
        Header("Accept-Ranges: bytes");             //返回的文件大小按照字節計算; 
        Header("Accept-Length:".$file_size);        //返回的文件大小;
        Header("Content-Disposition: attachment; filename=".$value);   //返回的文件的名稱;
        $buffer=1024;
        $file_count=0; 
        while(!feof($fp) && $file_count<$file_size){
        $file_con=fread($fp,$buffer);
        $file_count+=$buffer;
        echo $file_con;
        }
        fclose($fp);        
    }    
    }    
    }    
    } elseif ($_REQUEST['downloadall'] ) {     //一個表單多個提交按鈕,區分提交按鈕的name值;
        
    $picname=$_POST['del'];                    
    if($picname!=''){                     //去掉空值的狀況(沒有選中任何項,無表單傳值)
    $filename = "pic/download.zip"; //最終生成的文件名(含路徑) 
    if(!file_exists($filename)){      //從新生成文件      
      $zip = new ZipArchive();//使用本類,linux需開啓zlib,windows需取消php_zip.dll前的註釋  
      if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {  
        exit('沒法打開文件,或者文件建立失敗');
      }  
      foreach( $picname as $val){  
        if(file_exists("pic/$val")){  
          $zip->addFile( "pic/$val", basename($val));//第二個參數是放在壓縮包中的文件名稱,若是文件可能會有重複,就須要注意一下  
        }  
      }  
      $zip->close();//關閉  
    }  
    if(!file_exists($filename)){  
      exit("沒法找到文件"); //即便建立,仍有可能失敗。。。。  
    }  
    header("Cache-Control: public"); 
    header("Content-Description: File Transfer"); 
    header('Content-disposition: attachment; filename='.basename($filename)); //文件名  
    header("Content-Type: application/zip"); //zip格式的  
    header("Content-Transfer-Encoding: binary"); //告訴瀏覽器,這是二進制文件  
    header('Content-Length: '. filesize($filename)); //告訴瀏覽器,文件大小  
    @readfile($filename);    
    unlink($filename);
    }    
    }
header("location:picscan.php");
    ?>

還有好幾個功能沒有實現(文件的排序,中文文件名的轉碼等,涉及到批量上傳下載,中文轉碼總是報錯,若是有哪位大神有空,還請指點一二),慢慢摸索中......

相關文章
相關標籤/搜索