php 上传文件与下载文件

版权声明:独学而无友,则孤陋寡闻。q群582951247 https://blog.csdn.net/mp624183768/article/details/84134034

上传

/**
 * 单文件上传
 * @param array $fileInfo 文件信息 是一个数组
 * @param string $uploadPATH  文件上传默认路径
 * @param bool $imageFlag       是否检测真实图片
 * @param array $allowExt       允许上传的文件类型
 * @param int $maxSize          允许上传文件的最大值
 * @return bool|string
 */
function upload_file(array $fileInfo,$uploadPATH='./uploads',bool $imageFlag=true,array $allowExt=array('jpeg','jpg','png','gif'),int $maxSize=2097152){

    define("UPLOAD_ERRS",
        [
            UPLOAD_ERR_INI_SIZE=>"超过了PHP配置文件中upload_max_filesizez",
            UPLOAD_ERR_FORM_SIZE=>"超过了PHP配置文件中upload_max_filesizez",
            UPLOAD_ERR_PARTIAL=>"文件部分被上传",
            UPLOAD_ERR_NO_FILE=>"没有选择上传文件",
            UPLOAD_ERR_NO_TMP_DIR=>"没有临沭目录",
            UPLOAD_ERR_CANT_WRITE=>"文件不能被写入",
            UPLOAD_ERR_EXTENSION=>"扩展名错误",
            'not_true_image'=>"文件不是真实图片",
            'not_http_post'=>"文件不是通过HTTP POST上传的",
            'move_error'=>"文件不是通过HTTP POST上传的",
            'move_error'=>"文件移动失败",
        ]
    );
    //检测上传是否有错误
    if($fileInfo["error"]==UPLOAD_ERR_OK){
        //检测文件上传类型
        $ext=strtolower(pathinfo($fileInfo['name'],PATHINFO_EXTENSION));
        /** @var TYPE_NAME $allowExt */
     if(!in_array($ext,$allowExt)){
         echo UPLOAD_ERRS[UPLOAD_ERR_EXTENSION];
         return false;
     }
     //检测上传大小是否符合规范
        if($fileInfo['size']>$maxSize){
            echo UPLOAD_ERRS[UPLOAD_ERR_INI_SIZE];
            return false;
        }
        //检测是否是真实图片
        if($imageFlag){
            if(@!getimagesize($fileInfo['tmp_name'])){
                echo UPLOAD_ERRS['not_true_image'];
                return false;
            }
        }
        //检测文件是否通过HTTP POST方式上传来的
        if(!is_uploaded_file($fileInfo['tmp_name'])){
            echo UPLOAD_ERRS['not_http_post'];
            return false;
        }
        //检测目标目录是否存在,不存在则创建
        if(!is_dir($uploadPATH)){
            mkdir($uploadPATH,0777,true);
        }
        //生存唯一文件名,防止重命名产生覆盖
        $uniName=md5(uniqid(microtime(true),true)).".".$ext;
        $dest=$uploadPATH.DIRECTORY_SEPARATOR.$uniName;
        //移动文件
        if(@!move_uploaded_file($fileInfo['tmp_name'],$dest)){
            echo UPLOAD_ERRS['move_error'];
            return false;
        }
        echo '文件上传成功';
        return $dest;
    }else{
        $megs=UPLOAD_ERRS[$fileInfo["error"]];
        echo  $megs;
    }

}

upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<form action="doUpload.php" method="post" enctype="multipart/form-data">

    <input type="file" name="myFile" id="">
    <input type="submit" value="立即上传">
    
</form>
</body>
</html>

doUpload.php

<?php
/**
 * Created by PhpStorm.
 * User: liuan
 * Date: 2018-11-15 0015
 * Time: 14:36
 */
require_once 'func.php';
$fileInfo=$_FILES['myFile'];
var_dump(upload_file($fileInfo));

下载

/**
 * 下载文件
 * @param  string $filename     文件名
 * @param  array  $allowDownExt 允许下载的文件类型
 * @return void
 */
function down_file(string $filename,array $allowDownExt=['jpg','jpeg','png','gif','txt','html','php','rar','zip']){
if(!is_file($filename)||!is_readable($filename)){
  return false;
}
//检测文件类型是否允许下载
$ext=strtolower(pathinfo($filename,PATHINFO_EXTENSION));
if(!in_array($ext,$allowDownExt)){
  return false;
}

//通过header() 发送头信息
//告诉浏览器输出的是字节流
header('content-type:application/octet-stream');
//告诉浏览器返回的文件大小是按照字节进行计算的
header('Accept-Ranges:bytes');
//告诉浏览器返回的文件大小
header('Accept-Lenth:'.filesize($$filename));
//告诉浏览器 文件作为附件处理 告诉浏览器最终下载完的文件名称
header('Content-Disposition:attachment;filename=liuan_'.basename($filename));
//读取文件中的内容
readfile($filename);
exit;
}
/**
 * 下载文件
 * @param  string $filename     文件名
 * @param  array  $allowDownExt 允许下载的文件类型
 * @return void
 */
function down_file1(string $filename,array $allowDownExt=['jpg','jpeg','png','gif','txt','html','php','rar','zip']){
if(!is_file($filename)||!is_readable($filename)){
  return false;
}
//检测文件类型是否允许下载
$ext=strtolower(pathinfo($filename,PATHINFO_EXTENSION));
if(!in_array($ext,$allowDownExt)){
  return false;
}

//通过header() 发送头信息
//告诉浏览器输出的是字节流
header('content-type:application/octet-stream');
//告诉浏览器返回的文件大小是按照字节进行计算的
header('Accept-Ranges:bytes');
//告诉浏览器返回的文件大小
header('Accept-Lenth:'.filesize($filename));
//告诉浏览器 文件作为附件处理 告诉浏览器最终下载完的文件名称
header('Content-Disposition:attachment;filename=liuan_'.basename($filename));
//读取文件中的内容
//规定每次读取文件的字节数为1024字节 直接输出shuju
$read_buffer=1024;
$sum_buffer=0;
$handle=fopen($filename,'rb');
$filesize=filesize($filename);
while(!feof($handle)&&$sum_buffer<$filesize){
  $sum_buffer+=$read_buffer;
  echo "round($sum_buffer/$filesize,2)","<br/>";
  echo fread($handle,$read_buffer);
}
fclose($handle);
exit;
}

download.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>测试下载</title>
</head>
<body>
  <a href="discuzcj_zdy_v9.5.zip">下载1.zip</a>
  <br>
  <a href="download.php?filename=2.zip">下载2.zip</a>
    <a href="download.php?filename=3.zip">下载3.zip 有进度</a>
</body>
</html>

download.php

<?php
echo dirname(__FILE__);
require_once '../fileSystem/lib/func.php';
$filename=$_GET['filename'];
down_file1($filename);

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/84134034