使用PHP编写基于Web的文件管理系统

 更新时间:2016年11月25日 16:15  点击:1714
PHP有很多与文件系统相关的函数,不仅可以帮助你打开文件,还可以显示目录内容、移动文件等。很多人甚至使用PHP写出了基于Web的文件管理器。
 
  首先需要提醒一些关于文件路径的东西:在Windows你可以在文件路径中使用斜线“/”或反斜线“”,而其他操作系统仅使用”/”。出于兼容性考虑,以下实例使用“/”的表示方法:
  下面的简单脚本显示了一个基本的目录列表。注释在代码中并解释了每一步:

<? /* 在变量 $dir_name中给出希望访问的目录完整路径*/
 $dir_name = /home/me/;
 /* 创建句柄,打开给定目录的结果*/
 $dir = opendir($dir_name);
 /* 启动一段文本添加到将要放置列表元素(文件名)的地方 */
 $file_list = <ul>;
 /* 使用while语句,读取所打开目录的所有元素。如果文件名既非“.”及“..”则在列表中输出文件名*/
 while ($file_name = readdir($dir)) {
  if (($file_name != .) && ($file_name != ..)) {
   $file_list .= <li>$file_name;
  }
 }
 /* 终结列表 */
 $file_list .= </ul>;
 /* 关闭打开的目录句柄并结束PHP代码段*/
 closedir($dir);
?>
<!-- Start your HTML -->
<HTML>
<HEAD>
 <TITLE>Directory Listing</TITLE>
</HEAD>
<BODY>
 <!-- Use PHP to print the name of the directory you read -->
 <P>Files in: <? echo $dir_name; ?></p>
 <!-- Use PHP to print the directory listing -->
 <? echo $file_list; ?>
</BODY>
</HTML>
  这时已经有了一个目录列表。需要记住,要读取目录或文件(马上你会见到)中的内容用户所在的PHP运行平台必须至少对目录或文件有read权限。
  以下例子为如何复制文件:

<? /* 将需要复制的文件路径放入变量$original,复制的目标路径放入变量$copied */
 $original = /home/me/mydatabasedump;
 $copied = /archive/mydatabasedumo_1010;
 /* 使用函数copy() 复制源文件至目的地,或以输出错误信息结束*/
 @copy($original, $copied) or die(Couldn't copy file.);
?>
  示例脚本是备份系统的第一步。当脚本运行时,出于安全考虑它先将数据库复制到不同地点。通过对crontab的修改,你可以在选定时间执行此文件而无需用户介入。
  假设系统上已有Lynx,你可以创建crontab入口以运行Lynx并访问文件。访问文件将运行脚本并创建复制文件。以下例子将在早晨5点运行脚本,然后关闭Lynx:
0 5 * * * [username] lynx -dump http://localhost/copyfile.php 1>/dev/null 2>&1
  如果你运行的是PHP的CGI版本,你可以跳过Lynx部分并参考二进制文件:
0 5 * * * [username] php /path/to/copyfile.php 1>/dev/null 2>&1
  相对于Java由简入繁的演变趋势,PHP忠于简单易学原味的坚持受到广大开发者的欢迎,近年来声势大涨,而简单就是力量,这句话套用于近日PHP异军突起,再适合也不过了。老实说,原本觉得它不会太厉害,看到它最近的成长和茁壮,直攻Java阵营输于经营之处,让人对它刮目相看。
 
  Netscape前CEO Marc Andressen在Zend/PHP大会上预言,简单易学的描述语言PHP将会比Java被更多人用于Web应用的开发上;再引用Cnet台湾报导的数据,全球大约有2200万个网站使用PHP,而且数量还在稳定增加中。
 
  为什么PHP会如此受欢迎呢?我想简单好用是最大原因。如果网站只是提供使用者搜寻资讯的入口,网际网路上有许多现成、免费的、容易拿到,且已经做好的网站软体,如行事历、网站管理、新闻、报名系统、电子报、天气预报等免费的应用模组供下载安装使用,如此好康的事情,何乐而不为?而且只要买一本书,装一装,简单的设定就有讨论区,不用写任何程式,这对没有程式经验的人来说是好的进入点,也符合中小企业低成本建置网站的需求。作为Java人士,PHP的窜起给了我三个启示:
  Web 开发:PHP夹缝中求生存之道
  这些网路应用软体Java做不到吗?PHP夹在JSP(JavaServer Page )和ASP(Active Server Page )中间,说实在的,应该一点生存的机会都没有,因为他们的难易度、观念和架构、程式语法这三样差异不大;如果从弹性的角度来看,ASP可以去呼叫COM 元件,JSP是呼叫Java Beans元件,从开发延展性和系统的扩充性来说,都比PHP好太多,软体应用空间也相对更广阔。
 
  当然,这些语言因为各有特长,都各自有发展,而PHP在众多网站开发工具市场中没有变得比较差,反而变得比较大,软体是免费虽然是主因之一,但我认为更重要的是,PHP社群很专心地开发动态网页技术,而且这个点作对了,而如果要学ASP就还要再学VB,学元件开发,Java领域除了JSP外,还可以作Severlet,作Severlet就会想说把EJB结合在一起,所以体系会越来越复杂,越复杂就筑起更高的学习门槛,如此一来,学习意愿低,人才少,成本相对较高,直接影响企业采用意愿。
 
  现在的软体世界不只是应用之争,也是平台的拉锯战;过去开发人员会比较哪种程式语言比较棒,组合语言、Cobol、PL1、Ada(人工智慧)、LSPER、C等语言陆续问世,到最后只剩下C语言能留下来,连Pscal都需要有Delphi撑下来才能存活;如果要问说受欢迎的程式语言要具备什么特色,这些特色还真难归纳,例如开发弹性、功能强大、限制少、容易开发、使用性高等,每个语言先天都有这些特色,如果这些条件是程式语言存亡的关键因素,我想上述语言应该都不会结束,但随著技术演进和环境的改变,不适用或不符开发者需求的语言将逐渐被淘汰。
文件上传我们需要用到HTML里面表单的type=file类型,及其enctype属性。这是我们大家必须要用的。当然了PHP函数库当中的FILE函数库,字符串类型函数库,目录函数库及$_FILES[]的使用是我们必须要用到的。
 
  也许每一个站点都可能会对上传文件有许多的限制,这些限制会包括 文件类型,文件大小,扩展名,以及上传目录的存在与否,上传文件的存在与否,目录的可写性,可读性,上传文件的改名及怎样把文件从缓存当中复制到你所需要的目录当中。
  当然出错的预处理也是我们不容忽视的!如果再深一步的讨论我们还可以对文件的操作起用事件日志的记录。
  下面我们通过一段程序来实现这些功能:
  
  首先是我们预设的变量值,它包括文件大小,文件扩展名类型,MIMI类型,及是否删除的开关变量

$MAX_SIZE = 2000000;
$FILE_MIMES = array('image/jpeg','image/jpg','image/gif'
,'image/png','application/msword');
$FILE_EXTS = array('.zip','.jpg','.png','.gif');
$DELETABLE = true;

  下一部就是设置浏览器访问变量及目录访问变量:

$site_name = $_SERVER['HTTP_HOST'];
$url_dir = http://.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
$url_this = http://.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$upload_dir = files/;
$upload_url = $url_dir./files/;
$message =;

  建立上传目录并相应改变权限:

if (!is_dir(files)) {
 if (!mkdir($upload_dir))
  die (upload_files directory doesn't exist and creation failed);
 if (!chmod($upload_dir,0755))
  die (change permission to 755 failed.);
}

  用户请求的处理:

if ($_REQUEST[del] && $DELETABLE) {
 $resource = fopen(log.txt,a);
 fwrite($resource,date(Ymd h:i:s).DELETE - $_SERVER[REMOTE_ADDR].$_REQUEST[del]n);
 fclose($resource);
 if (strpos($_REQUEST[del],/.)>0); //possible hacking
 else if (strpos($_REQUEST[del],files/) === false); //possible hacking
 else if (substr($_REQUEST[del],0,6)==files/) {
国内不少论坛都存在跨站脚本漏洞,国外也很多这样的例子,甚至Google也出现过,不过在12月初时修正了。(编者注:关于跨站脚本漏洞攻击,读者可参阅《详解XSS跨站脚本攻击》)。跨站攻击很容易就可以构造,而且非常隐蔽,不易被查觉(通常盗取信息后马上跳转回原页面)。
  如何攻击,在此不作说明(也不要问我),主要谈谈如何防范。首先,跨站脚本攻击都是由于对用户的输入没有进行严格的过滤造成的,所以我们必须在所有数据进入我们的网站和数据库之前把可能的危险拦截。针对非法的HTML代码包括单双引号等,可以使用htmlentities() 。
 

<?php
$str = "A 'quote' is <b>bold</b>";
// Outputs: A 'quote' is <b>bold</b>
echo htmlentities($str);
// Outputs: A 'quote' is <b>bold</b>
echo htmlentities($str, ENT_QUOTES);
?>

  这样可以使非法的脚本失效。
  但是要注意一点,htmlentities()默认编码为 ISO-8859-1,如果你的非法脚本编码为其它,那么可能无法过滤掉,同时浏览器却可以识别和执行。这个问题我先找几个站点测试后再说。
  这里提供一个过滤非法脚本的函数:

function RemoveXSS($val) {
 // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
 // this prevents some character re-spacing such as <javascript>
 // note that you have to handle splits with , , and later since they *are* allowed in some inputs
 $val = preg_replace('/([x00-x08][x0b-x0c][x0e-x20])/', '', $val);
 // straight replacements, the user should never need these since they're normal characters
 // this prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A&#X61&
    _#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29>
 $search = 'abcdefghijklmnopqrstuvwxyz';
 $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
 $search .= '1234567890!@#$%^&*()';
 $search .= '~`";:? /={}[]-_|'';

include()和require()的区别 这相信是PHP中最基本的问题了,也是很多公司面试时必考的题呵呵。
给大家复习一下:
require() :如果文件不存在,会报出一个fatal error.脚本停止执行
include() : 如果文件不存在,会给出一个 warning,但脚本会继续执行
这里特别要注意的是:
使用include()文件不存在时,脚本继续执行,这种情况只出现在PHP 4.3.5之前,这一点,往往被人忽视。
推荐使用require_once()和include_once(),可以检测文件是否有重复包含。


[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。  ...2017-07-06
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • AI源文件转photoshop图像变模糊问题解决教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23