php文件上传下载实例(实现最简单的网盘功能)


本人是一个新手代码狗,第一次发表博客,欢迎大大们指点!

最近手头有一个文件上传下载的案例,跟大家一起分享一下作为一个新手的苦逼成长历程!

话不多说,先上代码:

<!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以内);

初稿做的是单一上传,后来改成的批量上传,在input中将name的名字从file改成file[],然后加上multiple=“multiple”就可以了(选择上传文件时可以使用鼠标或者键盘进行批量选择);

其实一开始小博是傻傻的用了N个input框进行上传的!= =。

 

二:图片的后台处理;

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

小博在实际过程中对于文件名符合类型但是大小过大的文件实行拦截,其他符合的会先一步上传。(但是如果上传的文件类型中有不符合的,批量上传会中断,没有文件上传);

三:文件展示页面(主页面)

<?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>

四:删除与下载后台处理页面

<?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");
    ?>

还有好几个功能没有实现(文件的排序,中文文件名的转码等,涉及到批量上传下载,中文转码老是报错,如果有哪位大神有空,还请指点一二),慢慢摸索中......


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM