`
wangyalei
  • 浏览: 51973 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

php学习笔记(上传与下载类)

    博客分类:
  • PHP
阅读更多

php中的文件上传很简单 不像java 中需要借助 commons-fileupload-1.2.1.jar 等第三个的上转工具来做,下面我写了一个简单的上转类。

php中$_FILES内置函数包含了要上传文件的所有信息量。

 

 $_FILES("uploadName"); 输出的话可以看见他是一个数组里面包含了 name,type,tmp_name,error,size元素

 

上传不可避免,要出现异常,php为此给出了5个类型常

  0---> 文件上转成功 --->UPLOAD_ERR_OK
  1--->上传文件超过php.ini 的upload_max_file的设置--->UPLOAD_ERR_INI_SIZE
  2--->上传文件超过特殊表单项MAX_FILE_SIZE(我们自己设置的)设置的值--->UPLOAD_ERR_FORM_SIZE
  3---> 文件只有部分上转-----> UPLOAD_ERR_PARTLAY
  4---> 没有文件被上转-----> UPLOAD_NO_FILE

 

  一个简单的上传

 

<?php

/******
 * @author wangyalei
 * 上传公用类
 *
 */
class upload {


    //上传的类型
    private $type = array();
	//上传的保存路径
    private $savepath;
	 //上传的大小
    private $size;
    //上传内容信息
    private $uploadinfo;

    private $label_name;

   /******
    * @param $type 可以是数组 也可是 多个字符串(字符串,字符串)
    * @param $savepath 上传后保存的路径
    * @param $size 设定上传的大小
    *
    */

    public function __construct($type,$savepath,$size,$label_name){


    	$this->type = is_array($type)?$this->type = $type:$this->type = implode(",",$type);
    	$this->savepath = $savepath;
    	$this->size = $size;
    	$this->label_name = $label_name;
 		$this->uploadinfo = $_FILES[$label_name];

    }

    //保存
    public function save(){

      //上传要进行检测是否合法

      //1 判断用户是真实上传
      if(!is_uploaded_file($this->uploadinfo["tmp_name"])){

			echo "文件不存在";
			exit;

      }


      //2判断类型是否正确

      if(!in_array($this->uploadinfo["type"],$this->type)){


      		 echo "<font color='red'>文件类型不符!只能上传".implode(',',$this->type)."类型</font>";
             exit;

      }

      //3判断上传大小

      if($this->size<$this->uploadinfo["size"]){

      	 echo "文件太大!";
         exit;

      }



   //2 判断是否有要保持的文件夹 如没有创建一个
	if(!file_exists($this->savepath)){

		mkdir($this->savepath);
     }

      //从临时目录移除 并给文件重命名 防止 重名覆盖
      if(!move_uploaded_file($this->uploadinfo["tmp_name"],$this->savepath."/".$this->uploadinfo["name"])){
         echo $this->uploadinfo["tmp_name"];
      	 echo "移动文件出错";
         exit;

      }

	  //最后判断一点错都没有
       if($this->uploadinfo["error"]=="0"){

       	   echo "上传成功";
       }

  }

}
?>

 

 测试一下:

 

<?php
/*
 * Created on 2010-8-19
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 */

include("upload.class.php");

 //上传文件类型列表
$uptypes=array(
    'image/jpg',
    'image/jpeg',
    'image/png',
    'image/pjpeg',
    'image/gif',
    'image/bmp',
    'image/x-png'
);

$max_file_size=2000000*1024;     //上传文件大小限制, 单位BYTE

$destination_folder="uploadimg"; //上传文件路径

 $upload = new upload($uptypes,$destination_folder,$max_file_size,"file1");
 $upload->save();

?>

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>上转文件</title>
</head>

<body>
   <form action="upload.php" method="post" enctype="multipart/form-data">
  			<input type="file" name="file1"><span id="upload"></span><br/>
            <input type="submit" name="submit" value="上传">
  </form>
</body>
</html>

 

 以上是上传,下面是下载

 

<?php

function download($url, $filename) {

  // 获得文件大小, 防止超过2G的文件, 用sprintf来读  %u 十进制无符号整数
     $filesize = sprintf ( "%u", filesize($url ) );
     //spinrtf 
      if (!$filesize) {
           return;
       }
         header ( "Content-type:application/octet-stream\n" ); //application/octet-stream
         header ( "Content-type:unknown/unknown;" );
	     header ( "Content-disposition: attachment; filename=\"" . $filename . "\"" );
	     header ( 'Content-transfer-encoding: binary' );
    if ($range = getenv ( 'HTTP_RANGE' )) { // 当有偏移量的时候,采用206的断点续传头
          $range = explode ( '=', $range );
        $range = $range [1];

//
          header ( "HTTP/1.1 206 Partial Content" );
          header ( "Date: " . gmdate ( "D, d M Y H:i:s" ) . " GMT" );
          header ( "Last-Modified: " . gmdate ( "D, d M Y H:i:s", filemtime ( $url ) ) . " GMT" );
          header ( "Accept-Ranges: bytes" );
          header ( "Content-Length:" . ($filesize - $range) );
          header ( "Content-Range: bytes " . $range . ($filesize - 1) . "/" . $filesize );
          header ( "Connection: close" . "\n\n" );
        } else {
           header ( "Content-Length:" . $filesize . "\n\n" );
         $range = 0;
       }
        loadFile ( $url );
  }

  function loadFile($filename, $retbytes = true) {
      $buffer = '';
       $cnt = 0;
     $handle = fopen ( $filename, 'rb' );
      if ($handle === false) {
         return false;
      }
      while ( ! feof ( $handle ) ) {
         $buffer = fread ( $handle, 1024 * 1024 );
         echo $buffer;
           ob_flush ();
           flush ();
         if ($retbytes) {
            $cnt += strlen ( $buffer );
            }
      }
      $status = fclose ( $handle );
       if ($retbytes && $status) {
          return $cnt; // return num. bytes delivered like readfile() does.
       }
     return $status;
 }


?>

 

测试代码

 

<?php

include("downupload.php");

download($_GET[url], $_GET[name]);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="index.php?url=index.php&name=我的.txt">下载</a>
</body>
</html>

 

 

分享到:
评论

相关推荐

    PHP文件上传与下载学习笔记

    PHP文件上传与下载学习笔记 PHP版本:1、文件上传配置 文件上传后,Php获取的上传文件的信息 PHP端config配置文件配置

    php学习笔记

    文件上传 53 写入文件 54 拷贝文件 54 文件和文件夹的创建和删除 55 画图 56 画饼状图 56 案例一:投票柱状统计图 57 案例二:验证码 59 GD库 60 PHP和数据库 64 mysql扩展库 64 一.创建一张用户表 64 二...

    PHP个人学习笔记上传

    PHP个人学习笔记,非常有用的啊,欢迎各位大佬下载使用哦

    PHP学习笔记(部分)

    网站开发必备之良器,怎可不学。上传一部分自己学PHP是做的笔记,希望对PHP学习的有一点帮助!!

    phpdemo:php学习笔记

    #php学习笔记 ##ajax文件夹下的小例子 ajax实现输入框自动完成功能 auto-complete.html,auto-complete.php ajax实现无刷新评论 comment.html,comment.php ajax实现无刷新点赞 praise.php handle-praise.php ajax实现...

    微信小程序学习笔记之文件上传、下载操作图文详解

    本文实例讲述了微信小程序学习笔记之文件上传、下载操作。分享给大家供大家参考,具体如下: 前面介绍了微信小程序登录API与获取用户信息操作。这里再来介绍一下文件的上传与下载操作。 【文件上传】wx.uploadFile ...

    selfimpr学习笔记合集(20101212)

    python php java javascript c等多种语言, 以及涉及到的各种框架, 数据库等个人笔记 总计38万+字, 打包上传以便备份, 有需要的朋友也可以下载

    qt4中文教程学习笔记

    CSDN上的QT4中文教程 我都下载试了下,都是什么PHP文件不能用. 还好从51CTO下载了份.上传下.以备大家共享.

    毕设&课设&项目&实训-计算机基础知识学习笔记.操作系统.计算机网络..zip

    毕设&课设&项目&实训-计算机基础知识学习笔记.操作系统.计算机网络.数据库..Java.后端.设计模式.数据结构与算法. 【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件...

    minisay笔记程序 1.2.0 beta.zip

    minIsay是一个简单的笔记程序,是我在学习php过程中的一个练习程序。 minIsay发布,主要用于记录一些简短,零碎的内容。minIsay是从Isay3修改、精简而来,minisay更简洁,操作更方便。 作者:wenbin(QQ:792278952...

    asp学习笔记

    asp基础HTML语言 用来描述网页/网站布局的标签语言 asp.net jsp php 1/必要格式 &lt;html&gt; &lt;head&gt; &lt;title&gt;欢迎来到学习HTML语言&lt;/title&gt; &lt;/head&gt; &lt;body&gt; 123456 &lt;/body&gt...

    渗透测试,文件上传漏洞笔记知识梳理图,适用于学习渗透测试初学者学习,仅供参考学习

    渗透测试,文件上传漏洞笔记知识梳理图,适用于学习渗透测试初学者学习,仅供参考学习。java php jsp jxsp,漏洞利用,前端验证,ISS,Apache,Nginx,通用手法,WAF绕过特殊情况处理,以及安全防护漏洞修复。

    毕设&课设&项目&实训-JavaScript学习笔记大全,基于JavaScript高级程序设计写的.zip

    【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码...鼓励下载和使用,并欢迎大家互相学习,共同进步。

    毕设&课设&项目&实训-基于Vuepress框架搭建的一个个人学习笔记文档站点.zip

    【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码...鼓励下载和使用,并欢迎大家互相学习,共同进步。

    毕设&课设&项目&实训-平时的学习笔记(关于STM32,Linux,ROS,HTML,CSS,电路基础,模拟电路,数字.zip

    【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码...鼓励下载和使用,并欢迎大家互相学习,共同进步。

    php小程序——记事本

    本程序是刚刚学习php是所写的一个练手程序包括登陆、防强登、分页、上传图片等等php和html的基本功能

    学习webpack的笔记,基于webpack5.zip

    【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码...鼓励下载和使用,并欢迎大家互相学习,共同进步。

Global site tag (gtag.js) - Google Analytics