fileupload.php: <?php /** * php上传文件时的配置: * 1.file_uploads = on|off :确定服务器上的php脚本是否可以接受上传文件 * 2.max_execution_time = integer :php脚本在注册一个致命错误之前可以执行的最长时间,以秒为单位 * 3.memory_limit = integer :设置脚本可以分配到的最大内存,以MB为单位。这可以防止失控的脚本独占服务器内存 * 4.upload_max_filesize = integer :设置上传文件的大小,以MB为单位,此指令必须小于post_max_size的值 * 5.upload_tmp_dir = string :设置上传文件在处理之前必须存放在服务器的一个临时位置,直到文件移动到最终目的为止 * 6.post_max_size = integer :确定通过post方法可以接受的信息大小,以MB为单位 */ //要上传文件,必须要表单.详细解析如下; /** * ENCTYPE="mult ipart/form-data" ,这里是固定写法,否则文件上传失败 ACTION="upload.php" ,定义要处理上传的程序文件路径 METHOD="post" ,定义传输方式为 POST ,一般情况下 Form 提交数据都设置为 POST < input type="hidden" name="MAX_FILE_SIZE" value="10000000" >,这是一个隐藏域, value的值(以字节B为单位)定 义了上传文件的大小上限,超过这个值时,上传失败。它必须定义在文件上传域的前面 . 而且这里定义的值不 能超过在 php.ini 文件中 upload_max_filesize 设置的值 , 否则没有意 义了 . (注意: MAX_FILE_SIZE 的值只是对浏览器的一个建议,实际上它可以被简单 的 绕过。因此不要把对浏览器的限制寄希望于该值。实际上, PHP.ini 设置中的上传文件最 大值,是不会 失效的。但是最好还是在表单中加上 MAX_FILE_SIZE ,因为它可以避 免用户在花时间等待上传大文件之后才发现该文件太大了的麻烦。) 1MB=1024KB,1KB=1024B,B是byte。 <input type="file" name="userfile" /> , 这是文件上传域 ,Type 属性必须设置为 file, 但 Name属性 可以自定义 , 这个值会在代码文件中使用 . * */ ?> <form enctype="multipart/form-data" action="upload.php" method="post"> <input type="hidden" name="MAX_FILE_SIZE" value="10000000" /> 上传文件:<input type="file" name="userfile" /> <input type="submit" value="上传" /> </form> upload.php: <?php /** * 接受上传文件 * $_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: 表示没有上载任何文件。 */ //[userfile][name]表示上传的文件名 //[userfile][type]表示文件的类型 //[userfile][tmp_name]表示上传文件的临时存放位置 //[userfile][error]表示上传文件的错误类型,0表示没有错误 //[userfile][size]表示上传文件的字节大小 print_r($_FILES); echo '<br>'; define('MAX_SIZE', 20000000);//定义MAX_SIZE常量的值为20M $fileMimes = array('image/jpeg','image/pjpeg','image/png','image/x-png','image/gif'); //is_uploaded_file():判断文件是否通过HTTP POST上传的。 //通过HTTP POST上传后,文件会存放在临时文件夹下 //第二个问题,只能充许jpg类型文件上传.下面的代码在ie下会有bug。因为在ie中上传的.jpg文件,后缀会变成jpeg。 /*if($_FILES['userfile']['type']!='image/jpeg'){ echo "<script>alert('本站只充许jpg格式上传');history.back();</script>"; exit; }*/ //所以,为了兼容ie与firefox下导致上传的.jpg文件能正确执行。需要采用如下的代码。 /*if($_FILES['userfile']['type']!='image/jpeg' && $_FILES['userfile']['type']!= 'image/pjpeg'){ echo "<script>alert('本站只充许jpg格式上传');history.back();</script>"; exit; }*/ switch ($_FILES['userfile']['type']) { case 'image/jpeg': //火狐支持的 ; break; case 'image/pjpeg': //ie 支持的 break; case 'image/gif': break; case 'image/png': //火狐支持的 break; case 'image/x-png'://ie支持的 break; default:echo "<script>alert('本站只充许jpg、Png、gif格式的文件上传');history.back();</script>"; exit; } //将上面的switch代码再进行改进。在上面定义一个数组变量$fileMimes.用in_array()函数来判断类型是否为数组中的一种。如下: //先判断数组变量是否存在 if (is_array($fileMimes)){ //如果数组变量存在,则判断文件的后缀名是否在定义的数组变量中 if (!in_array($_FILES['userfile']['type'], $fileMimes)){ echo "<script>alert('本站只充许jpg、Png、gif格式的文件上传');history.back();</script>"; exit; } } //如果需要允许.png,.gif格式的文件上传,用上面的格式写的话,会很复杂。可以考虑采用下面的方式实现 //先判断文件名比先判断文件大小,性能更高 //第一个问题:如果上传错误,怎么办? if ($_FILES['userfile']['effor']>0){ switch ($_FILES['userfile']['error']){ case 1:echo "<script>alert('文件大小超过 PHP 配置文件中指定upload_max_filesize的值');history.back();</script>"; break; case 2:echo "<script>alert('表示上载文件大小超出了 HTML 表单的 MAX_FILE_SIZE 元素 所 指定的最大值。');history.back();</script>"; break; case 3:echo "<script>alert('部分被上传');history.back();</script>"; break; case 4:echo "<script>alert('没有任何文件上传');history.back();</script>"; break; } exit; } //下面这句最后用来判断上传的文件是否超过20M。自定义的。如果在表单中没有指定value的值,则需要在此做判断 if ($_FILES['userfile']['size']>MAX_SIZE){ echo "<script>alert('上传文件大小不得超过20M');history.back();</script>"; } if(is_uploaded_file($_FILES['userfile']['tmp_name'])) { //如果找到临时文件,则在这里进行用代码实现移动文件到目的地。函数:move_uploded_file(),返回布尔值 //第一个参数写上临是文件地址,第二个参数写上需要存文件的目的地址(需要先判断目录是否存在) //如果想屏蔽页面的上警告信息,则需要在代码前加上@符号即可.@move_uploaded_file($_FILES['userfile']['tmp_name'], 'uploads/'.$_FILES['userfile']['name']) if (!move_uploaded_file($_FILES['userfile']['tmp_name'], 'uploads/'.$_FILES['userfile']['name'])){ //移动失败,则执行内部代码 //echo '移动失败!'; echo "<script>alert('移动文件失败');history.back();</script>"; exit; //后面的代码就不执行 } //echo '上传的临时文件已找到,等待移动中......'; }else { echo "<script>alert('找不到上传的文件');history.back();</script>"; exit; } //全部通过就上传成功 //必须传一个值给(文件上传的地址)uploadseccess.php. echo "<script>alert('文件上传成功');location.href='uploadsuccess.php?url=".$_FILES['userfile']['name']."';</script>"; ?> uploadsuccess.php: <?php //接收upload.php以链接形式传递过来的参数。是get方式 $url = $_GET['url']; echo '<img src="uploads/'.$url.'"/>'; ?> |
|