用PHP文件上传的具体思路及实现
文件上传我们需要用到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 doesnt 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/) {
unlink($_request[del]);
print <script>window.location.href=$url_this?message=deleted successfully</script>;
}
}
else if ($_files[userfile]) {
$resource = fopen(log.txt,a);
fwrite($resource,date(ymd h:i:s).upload - $_server[remote_addr]
.$_files[userfile][name].
.$_files[userfile][type].\\n);
fclose($resource);
$file_type = $_files[userfile][type];
$file_name = $_files[userfile][name];
$file_ext = strtolower(substr($file_name,strrpos($file_name,.)));
//文件大小的检查:
if ( $_files[userfile][size] > $max_size)
$message = the file size is over 2mb.;
//file type/extension check
else if (!in_array($file_type, $file_mimes)
&& !in_array($file_ext, $file_exts) )
$message = sorry, $file_name($file_type) is not allowed to be uploaded.;
else
$message = do_upload($upload_dir, $upload_url);
print <script>window.location.href=$url_this?message=$message</script>;
}
else if (!$_files[userfile]);
else
$message = invalid file specified.;
列出我们上传的文件:
$handle=opendir($upload_dir);
$filelist = ;
while ($file = readdir($handle)) {
if(!is_dir($file) && !is_link($file)) {
$filelist .= <a href=$upload_dir$file>.$file.</a>;
if ($deletable)
$filelist .= <a href=?del=$upload_dir$file title=delete>x</a>;
$filelist .= <sub><small><small><font color=grey> .date(d-m h:i, filemtime($upload_dir.$file))
.</font></small></small></sub>;
$filelist .=<br>;
}
}
function do_upload($upload_dir, $upload_url) {
$temp_name = $_files[userfile][tmp_name];
$file_name = $_files[userfile][name];
$file_name = str_replace(\\\\,,$file_name);
$file_name = str_replace(,,$file_name);
$file_path = $upload_dir.$file_name;
//file name check
if ( $file_name ==) {
$message = invalid file name specified;
return $message;
}
$result = move_uploaded_file($temp_name, $file_path);
if (!chmod($file_path,0777))
$message = change permission to 777 failed.;
else
$message = ($result)?$file_name uploaded successfully. :
somthing is wrong with uploading a file.;
return $message;
}
?>
<center>
<font color=red><?=$_request[message]?></font>
<br>
<form name=upload id=upload enctype=multipart/form-data method=post>
upload file <input type=file id=userfile name=userfile>
<input type=submit name=upload value=upload>
</form>
<br><b>my files</b>
<hr width=70%>
<?=$filelist?>
<hr width=70%>
<small><sup>developed by
<a style=text-decoration:none href=http://tech.citypost.ca>citypost.ca</a>
</sup></small>
</center>
- · 回顾与展望PHP 5.0的变化与PHP 6.0展望
- · 一个产生中文累计数的代码片断
- · 在SQL Server 2005中解决死锁
- · 30分钟正则表达式指导
- · 不算不知道 44% 数据库开发者使用MySQL
- · 立即释放.net下的com组件
- · XHTML的目标,规则和细节
- · SQL Server 2005 提供的分页查询支持
- · ASP.NET程序中常用的三十三种代码
- · Sql server存储过程和C#分页类简化你的代码
- · SQL Server 2005新功能-TSQL
- · 在SQL Server 2005中编辑SQL Server 2000 DTS
- · .NET 连接到 Oracle的oci.dll加载错误解决方案
- · 如何在调用线程的时候传递参数
- · 专家预言:PHP将比Java更好更受欢迎
- · 在IIS6.0下ASP .NET 的版本冲突问题
- · 解决SqlTransaction用尽的问题(SQL处理超时)
- · 以前编写Like谓词被忽略的使用方法
- · 在编写存储过程时使用 Set NoCount On
- · ASP.NET 2.0运行时简要分析
- · .Net中如何操作IIS(原理篇)
- · 用.net开发不同操作系统下应用的winform的size大小问题
- · SQL Server数据库文件恢复技术
- · SQL SERVER中一些常见性能问题的总结
- · .NET下对二进制文件进行加密解密(C#)
- · 利用.NET的File控件上传文件的最终解决方案(个人版)
- · 如何把图片、声音等存储到sql中
- · MS-SQL server数据库开发精典技巧
- · 全文索引—CONTAINS语法
- · 获得所有表信息的SQL语句
- · .NET扫描远程计算机注册表
- · 利用JS获取IE客户端IP及MAC的实现
- · 简单而又复杂的ASP.NET编程模型
- · C#2.0终于有了?:便捷判断的单分支版
- · SQL Server 2005 Data Mining简介
- · ASP.NET控件开发之
- · ASP.NET中用哪种方式表格化数据
- · .NET平台下几种SOCKET模型的简要性能供参考
- · 使用 XML 模板 (MSSQL手册)
- · 使用带批注的 XDR 架构创建 XML 视图
- · 在XPath查询中指定轴(转自MSSQL手册)
- · JavaScript极速狂飙:CSS样式表的背景渲染效率
- · javascript应用:实现复选框全选/全不选切换
- · JavaScript极速狂飙:大容量字符型数组的快速检索
- · JavaScript极速狂飙:组合拼接字符串的效率
- · 图片自动缩小的js代码,用以防止图片撑破页面
- · PHP漏洞中的战争
- · automation服务器不能创建对象
- · Oracle数据库的备份及恢复策略研究
- · PHP程序加速探索之脚本执行速度测试
- · PHP中路径问题的解决方案
- · 学以致用 驳“ASP低能论”
- · 另类扩展名同样执行ASP
- · 语言决不是语法的不同之.NET 版本计算表达式的值
- · ASP中实现的类似URLEncode的编码函数及对应解码函数
- · 数据对象扩展成默认组件 PHP开发小组发布PHP5.1.0
- · ASP.NET 揭秘 ASP.NET页面的结构
- · 关于Sql server数据库日志满的快速解决办法
- · PHP+MySQL分页显示示例分析
- · ORACLE SQL性能优化系列(九)

