PHP开发中文件的上传与下载

时间:2021-12-19 04:13:16

在PHP中想要实现文件的上传功能其实很简单。。下面我们就来先介绍一下要用的知识点,最后再给出源码。

要让Web服务器具有上传功能,得在配置文件php.ini中设置允许文件上传。配置文件php.ini对文件上传的选项如下表所示。

文件上传配置选项表
选项 默认值 说明
file_uploads 1(默认开启) 是否开启文件上传
upload_tmp_dir null(系统临时目录) 上传文件的临时存储目录
upload_max_filesize                 2M 允许上传文件大小的最大值

当然,上传功能默认是开启的,也可以根据自己的需要去php.ini更改设置。

接下来,简要说明下文件上传的步骤:

1.文件的上传首先通过HTML表单中的file控件将文件上传至php.ini中upload_tmp_dir指定的临时目录。

2.然后由PHP函数move_uploaded_file将上传的文件从临时文件移动到服务器指定目录。


OK,源码奉上,不懂得地方可看注释:

upload.html

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<meta name="viewport" content="user-scalable=no, width=device-width"/>
<form action="uploadhandle.php" enctype="multipart/form-data" method="post"
name="uploadfile">
选择上传文件:<input type="file" name="upfile" /><br>
<input type="submit" value="上传" />
</form>

要注意的是必须指定表单的enctype属性为“multipart/form-data”才可上传文件。

uploadhandle.php

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<meta name="viewport" content="user-scalable=no, width=device-width"/>
<?php
// include_once 'Error.php';

//文件上传表单所在的文件名
$uploadPage = "upload.html";
//获取要上传到的目录,这里__FILE__变量表示文件当前的绝对路径(包含文件名);realpath的作用是获取规范的绝对路径;dirname作用是去掉文件名,获得目录名
$dir = dirname(realpath(__FILE__)).DIRECTORY_SEPARATOR;//这里DIRECTORY_SEPARATOR其实就是‘/’

//定义一个保存错误信息的变量
$err_msg = false;
//判断是否上传了文件
if(!isset($_FILES['upfile'])){
$err_msg = "表单不完全";
}
else{
$fileImg = $_FILES['upfile'];
}

//判断上传的文件是否正确,如果不正确则给予相应的错误信息
switch ($fileImg['error']){

case UPLOAD_ERR_INI_SIZE:
$err_msg = "文件超过最大上传限制,请重新<a href='{$uploadPage}'>上传</a>\n ";
break;
case UPLOAD_ERR_PARTIAL:
$err_msg = "文件上传不完全,请重新<a href='{$uploadPage}'>上传</a>\n ";
break;
case UPLOAD_ERR_NO_FILE:
$err_msg = "没有选择文件,请重新<a href='{$uploadPage}'>上传</a>\n ";
break;
case UPLOAD_ERR_FORM_SIZE:
$err_msg = "文件超过页面最大上传限制";
break;
case UPLOAD_ERR_CANT_WRITE:
$err_msg = "文件写入失败,请重新<a href='{$uploadPage}'>上传</a>\n";
break;
case UPLOAD_ERR_NO_TMP_DIR:
$err_msg = "没有临时文件夹,请重新<a href='{$uploadPage}'>上传</a>\n";
break;
case UPLOAD_ERR_OK:
break;
default:
$err_msg = "未知错误,请重新<a href='{$uploadPage}'>上传</a>\n";

}
//规定上传的文件的种类,如果没有上传规定的种类则给予错误信息
if(!in_array($fileImg['type'], array('image/jpeg','image/pjpeg','image/png'))){
$err_msg = "只允许上传.png或.jpg的图片。请重新<a href='{$uploadPage}'>上传</a><br/>";
}
//如果上传的文件没有出错,则将该文件从临时文件夹转移到给定的文件夹(这里将图片保存到是当前目录下的source文件夹里)
if(!$err_msg){
if(!move_uploaded_file($fileImg['tmp_name'], $dir."source/".$fileImg['name'])){
$err_msg = "移动文件失败。请重新<a href='{$uploadPage}'>上传</a><br/>";
}
}
//如果以上步骤有出现错误,则输出错误信息,否则显示出刚上传的图片
if($err_msg){
echo $err_msg;
}
else{
echo "<img src='source/{$fileImg['name']}' alt = '上传的文件' title='上传的文件' />";
echo "上传成功!";
}


至于文件的下载嘛,那就更简单了*>_<*

对于文件的下载,只需给出要下载文件的所在位置即可

download.php

<?php
//相对于网站根目录文件存储路径
$downdir = "source/";
//打开目录
$dirHandle = @opendir($downdir);
//读取里面的所有文件(除了本身和上级目录)
while($filen = readdir($dirHandle)){
if($filen != "." && $filen != ".."){
echo "<a href='".$downdir.$filen."'>".$filen."</a><br/>";
}
}
//关闭目录
closedir($dirHandle);