赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 编程语言

常用的编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN


首页 > 专业技术 > 编程语言 > PHP文件上传和下载
PHP文件上传和下载
1.文件上传:

文件上传是Web中最常见的应用之一。在PHP中可以接受任何来自标准浏览器的上传文件,使用这种特性可以上传文本文件、图片或者二进制文件。

1)准备文件上传表单:

与普通的表单提交数据不同,在实现文件上传时,表单的method方式必须为POST。另外,还需要添加上传的属性enctype="multipart/form-data",该属性指示浏览器可以提供文件上传功能,服务器端提交的数据中包含文件的数据。示例表单代码:
<form name="form1" method="post" action="" enctype="multipart/form-data">
   <input type="hidden" name="max_file_size" value="264104" />
   你要上传的文件:<input type="file" name="file" id="file" />
   <input type="submit" name="upload" id="button" value="提交" />
</form>
文件上传表单与普通表单的不同之处主要有:
·表单使用POST方式进行提交,并且有一个enctype属性提示表单中有二进制文件数据
·type属性为file将显示一个文件输入框,并提供“浏览”按钮允许用户选择文件
·type属性为hidden表示隐藏域,通过其value值指定允许上传文件的最大尺寸(字节)
这里的隐藏域并不能真正地限制文件上传大小,而是将它作为一个变量的值随表单一起提交,然后在PHP端进行比较和验证。

2)处理上传文件:

用户通过客户端浏览器的上传表单提交之后,PHP将会自动生成一个$_FILES数组,其中保存了上传文件的信息。
假设选择文件的代码为:
<input type="file" name="file" id="file" />
关于该文件的所有信息都包含在$_FILES[“file”]数组中,并且在该数组中包含了如下的键:
·$_FILES["file"]["name"]:被上传文件的名称,例如b.jpg、a.png
·$_FILES["file"]["type"]:被上传文件的类型,例如image/png
·$_FILES["file"]["size"]:被上传文件的大小,以字节为单位
·$_FILES["file"]["tmp_name"]:存储在服务器的文件的临时副本的名称
·$_FILES["file"]["error"]:由文件上传导致的错误代码
在文件上传时,$_FILES["file"]["error"]会返回不同的常量值表示不同的错误,如下表:


属性名称

说明

UPLOAD_ERR_OK

没有错误发生,文件上传成功

UPLOAD_ERR_INI_SIZE

上传文件大小超过php.ini中upload_max_filesize选项限制的值

UPLOAD_ERR_FORM_SIZE

上传文件大小超过表单中max_file_size选项指定的值

UPLOAD_ERR_PARTIAL

文件只有部分被上传

UPLOAD_ERR_NO_FILE

用户没有提供任何文件上传(没有选择文件)

如下是一个完整的PHP端接收文件、文件检查以及上传的示例代码:
<?php
  if (isset($_POST["upload"] )) { //单击“提交”按钮
     //定义允许上传文件类型数组
     $allowtype=array("image/gif", "image/jpeg", "image/png", "image/jpg", "image/pjpeg");
     if ($_FILES["file"]["size"]==0 ) //发送错误
        echo  ("错误,不能读取文件。<hr />");
     if ($_FILES["file"]["error"]==2 ) //检测文件大小
        echo  "错误,文件不能超过".$_POST["max_file_size"]." 字节。<hr />";
     if (!in_array($_FILES["file"]["type"], $allowtype) ) { //检测文件类型
        echo  ("错误,不支持当前的文件类型,请重新选择。<hr />");
     }else{
        echo  "<table width=100%><tr><td><h2>文件上传成功,信息如下</h2>";
        echo  "文件名称:".$_FILES["file"]["name"]."<br />"; //上传的文件名称
        echo  "文件类型:".$_FILES["file"]["type"]."<br />"; //上传的文件类型
        echo  "文件大小:".$_FILES["file"]["size"]/1024."Kb<br />"; //上传的文件大小
        echo  "文件临时副本名称:".$_FILES["file"]["tmp_name"]."<br />"; //文件别名
        if (file_exists("uploads/".$_FILES["file"]["name"])) { //判断文件是否存在
          echo  $_FILES["file"]["name"]."文件已经存在"; //输出存在相同文件提示
        }else{
           move_uploaded_file($_FILES["file"]["tmp_name"],
              "uploads/".$_FILES["file"]["name"]); //开始上传
           echo  "文件存储在:"."uploads/".$_FILES["file"]["name"];  //输出上传后路径
        }
        echo  "</td><td>";
        echo  "<img src="."uploads/".$_FILES["file"]["name"]." width=100>";
        echo  "</td></tr></table>";
     }
}
?>

2.文件下载:

下载文件要简单很多,首先需要用户单击一个链接触发下载动作。示例:
<a href="?action=download">下载文件到本地</a>
然后还需要指定要下载文件的名称和路径,并打开该文件输出文件类型、大小和内容:
  header("Content-type:application/octet-stream"); //文件类型
  header("Accept-Ranges:bytes"); //文件大小
  header("Accept-Length:".filesize('1.jpg')); //文件大小
  header("Content-Disposition:attachment;filename=1.jpg"); //附件形式指定下载文件名称
最后使用PHP中的fread()函数将文件内容直接在页面中输出,让浏览器提示用户下载。所有的这些处理都是在服务器端完成,因此用户是不会知道文件具体位置信息,是非常安全的一种下载方法。
示例:创建FileDownload.php文件,其中包括下载列表
<table width="400" align="center">
<tr><th bgcolor="#CCCCCC">文件名称</th> <th bgcolor="#CCCCCC">操作</th></tr>
<tr>
  <td>网站Logo图片</td>
  <td><a href="download.php?action=download&fname=logo.jpg">下载</a></td>
</tr>
<tr>
  <td>第2批代理商审批结果.xls</td>
  <td><a href="download.php?action=download&fname=agent_2.xls">下载</a></td>
</tr>
<tr>
  <td>订购单.doc</td>
  <td><a href="download.php?action=download&fname=<?php echo urlencode
      ("订购单.doc"); ?>">下载</a></td>
</tr>
可以看到,当点击“下载”链接将向Download.php文件传递两个参数,action=download表示要执行下载动作,fname表示要下载的文件名称。
Download.php文件中编写真正实现下载的代码:
<?php
  if (isset($_GET["action"] )) { //单击“下载”按钮
     $file_name=urldecode(trim($_GET['fname'])); //获取要下载的文件名
     $file_dir="upload/";
     $fileurl=$file_dir.$file_name; //指定文件路径
     if (!file_exists($fileurl))  { //检查文件是否存在
        echo  "文件找不到"; //输出错误提示
        exit(); //退出
     }else{
        $file=fopen($fileurl, "r"); //打开文件
        header("Content-type:application/octet-stream"); //输入文件类型
        header("Accept-Ranges:bytes");
        header("Accept-Length:".filesize($fileurl)); //输入文件大小
        header("Content-Disposition:attachment;filename=".$file_name); //输入文件名称
        echo  fread($file, filesize($file_dir.$file_name)); //开始下载
        fclose($file); //关闭文件
        exit;
     }
}
?>
浏览FileDownload.php文件,从文件列表中单击“下载”链接后则弹出一个文件下载对话框。

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659