这里有三个文件。分别是demo1,demo2,demo3。demo1是表单元素,demo2是业务逻辑处理,demo3是上传后的图片展示。相关说明都在代码的注释中。代码在最后。
PHP上传配置
有一些配置指令可用于精细地调节PHP的文件上传功能。这些指令用来确定是否启用PHP的文件上传、可允许的最大上传文件大小、可允许的最大脚本内存分配和其他各种重要的资源。
- file_uploads=on|off : 确定服务器上的PHP脚本是否可以接受文件上传。
- max_execution_time=integer :PHP脚本在注册一个致命错误之前可以执行的最长时间,以秒为单位。
- memory_limit=integer : 设置脚本可以分配到的最大内存,以MB为单位。这可以防止失控的脚本独占服务器内存。
- upload_max_filesize=integer :设置上传文件最大大小,以MB为单位。此指令必须小于post_max_size。
- upload_tmp_dir=string :设置上传文件在处理之前必须存放在服务器的临时一个位置,直到文件移动到最终目的地为止。
- post_max_size=integer :确定通过POST方法可以接受的信息的最大大小,以MB为单位。
$_FILES数组
demo1:
<form enctype="multipart/form-data" action="demo2.php" method="POST" >
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
<input type="file" name="userfile" multiple="multiple">
<input type="submit" value="submit" />
</form>
<input type=”hidden” name=”MAX_FILE_SIZE” value=”1000000”>,这是一个隐藏域,定义了上传文件的大小上限,超过这个值时,上传失败。
它必须定义在文件上传域的前面.而且这里定义的值不 能超过在php.ini 文件中upload_max_filesize设置的值,否则没有意义了.(注意:MAX_FILE_SIZE 的值只是对浏览器的一个建议,实际上它可以被简单的绕过。因此不要把对浏览器的限制寄希望于该值。
实际上,PHP.ini设置中的上传文件最大值,是不会 失效的。但是最好还是在表单中加上 MAX_FILE_SIZE,因为它可以避免用户在花时间等待上传大文件之后才发现该文件太大了的麻烦。)
<input type="file" name="userfile" />
,这是文件上传域,Type属性必须设置为file,但Name属性可以自定义,这个值会在代码文件中使用.
$_FILES超级全局变量,它储存各种与上传有关的信息,这些信息对于通过PHP脚本上传到服务器的文件至关重要。
1.存储在$_FILES["userfile"]["tmp_name"]
变量中的值就是文件在Web服务器中临时存储的位置。
2.存储在$_FILES["userfile"]["name"]
变量中的值就是用户系统中的文件名称。
3.存储在$_FILES["userfile"]["size"]
变量中的值就是文件的字节大小。
4.存储在$_FILES["userfile"]["type"]
变量中的值就是文件的MIME类型,例如:text/plain或image/gif。
5.存储在$_FILES["userfile"]["error"]
变量中的值将是任何与文件上载相关的错误代码。这是在PHP4.2.0中增加的新特性。error分别提供了一些数组常量:0:表示没有发生错误,1:表示上载文件的大小超出了约定值。文件大小的最大值是PHP配置文件中指定的,该指令是upload_max_filesize。2:表示上载文件大小超出了HTML表单的MAX_FILE_SIZE元素所指定的最大值。3:表示文件只被部分上载。4:表示没有上载任何文件。
PHP上传函数
PHP的文件系统库中提供了大量文件处理函数,除此之外,PHP还提供了两个专门用于文件上传过程的函数:is_uploaded_file()
和move_uploaded_file()
。
demo1.php
<form enctype="multipart/form-data" action="demo2.php" method="POST" >
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" /><!--隐藏域,定义文件的大小-->
<input type="file" name="userfile">
<input type="submit" value="submit" />
</form>
demo2.php
<?php
//设置编码格式
header('Content-type:text/html;charset=utf-8');
//常量定义
define('MAX_SIZE',1000000);//最大文件大小
define('URL',dirname(__FILE__).'\uploads');//上传文件在当前文件路径的uploads文件夹下
//允许的照片类型
$fileMimes = array('image/jpeg','image/pjpeg','image/png','image/x-png','image/gif');
if( is_array($fileMimes) ) {
//判断照片类型
if (!in_array($_FILES['userfile']['type'],$fileMimes)) {
echo "<script>alert('本站只允许jpg、gif、png图片!');history.back();</script>";
exit;
}
}
//错误处理
if ($_FILES['userfile']['error'] > 0) {
switch ($_FILES['userfile']['error']) {
case 1: echo "<script>alert('上传文件超过约定值1');history.back();</script>";
break;
case 2: echo "<script>alert('上传文件超过约定值2');history.back();</script>";
break;
case 3: echo "<script>alert('部分被上传');history.back();</script>";
break;
case 4: echo "<script>alert('没有任何文件被上传');history.back();</script>";
break;
}
exit;
}
//判断配置大小
if ($_FILES['userfile']['size'] > MAX_SIZE) {
echo "<script>alert('上传文件太大');history.back();</script>";
exit;
}
//判断目录是否存在
if (!is_dir(URL)) {
mkdir(URL,0777); //最大权限0777,意思是,如果没有这个目录,那么就创建
}
//如果上传的文件在临时目录
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
//移动文件到指定目录,如果想屏蔽掉警告,直接加上@
if (!@move_uploaded_file($_FILES['userfile']['tmp_name'],URL.'/'.$_FILES['userfile']['name'])) {//第一个参数,写上临时文件的地址,第二个参数,第二个参数写上你要存放的地址
//如果移动失败,就失败
echo "<script>alert('移动失败');history.back();</script>";
exit;
}
} else {
echo "<script>alert('临时文件夹找不到上传的文件');history.back();</script>";
exit;
}
//文件上传成功,跳到demo3
echo "<script>alert('文件上传成功');location.href='demo3.php?url=".'uploads/'.$_FILES['userfile']['name']."';</script>"
?>
demo3.php
<?php
$url = $_GET['url'];
echo '<img src=" '.$url.' ">';
?>