允许用户从表单上传文件是非常有用的。先来看一段HTML表单代码

<html>
<body>   <form action="upload_file.php" method="post"     enctype="multipart/form-data">     <label for="file">Filename:</label>
    <img src="getMemberAvatar.jpg" id="save_file" />
    <input type="file" name="file" id="file" accept="image/jpg, image/jpeg" />
    <br />
    <input type="submit" name="submit" value="Submit" />   </form> </body>
</html>

然后再来一段js代码,这里使用的是 jquery.js

<scrtipt type="text/javascript" src="js/jquery.min.js"></script>
<script>
$(function(){
$("#save_file").click(function(){
$("#file").click();//给id为file的元素绑定一个click事件
})
$("#pic").change(function(){
var PIC_EXT = new Array('.jpg','.jpeg','.gif','.png');
var pic = $(this).val(); })
})
</script>

知识点:

1、<form>标签中的enctype属性规定了在提交表单的时候要使用哪一种内容类型、在表单需要二进制数据时,比如文件内容,一定要使用这个属性:enctype="multipart/form-data".

2、<label>标签为input元素定义标注(标记).<label>标签中的for属性应该与相关元素id属性相同,那么当用户点击选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上。

3、允许用户上传文件存在巨大的安全风险。请仅仅允许可信任的用户执行上传文件操作,并且在服务器做相应的校验

下面是一个upload.file.php实例,其中包含了几点内容:

1、上传限制:户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb;

2、保存被上传的图片:文件被上传结束后,默认地被存储在了临时目录中,这时必须将它从临时目录中删除或移动到其它地方,如果没有,则会被删除。也就是不管是否上传成功,脚本执行完后临时目录里的文件肯定会被删除,所以我们在上传成功的时候要把这个临时文件复制一个存到图片文件夹中

上传限制

在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb

 <?php
//用户只能上传 .gif 或 .jpeg 文件 文件大小必须小于 20 kb:
$type = ($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FIELS["file"]["type"] == "image/pjpeg");
$tip_msg="";
if($type && $_FILES["file"]["size"] <20000 ){
$tip_msg = $_FILES["file"]["error"] > 0 ? $_FILES["file"]["error"] : "" ;
if(empty($tip_msg)){
echo "Upload: " . $_FILES["file"]["name"] . "<br />"; //被上传文件的名称
echo "Type: " . $_FILES["file"]["type"] . "<br />"; //被上传文件的文件类型
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; //被上传文件的大小,以字节计
echo "Stored in: " . $_FILES["file"]["tmp_name"]; //存储在服务器的文件的临时副本的名称 if(file_exists("upload/".$_FILES["file"]["name"])){
echo $_FILES["file"]["name"]."already exists. ";
}else{
if(is_uploaded_file($_FILES["file"]["tmp_name"])){ //检测文件是否是通过http post方式传上来的
$stored_path = $_SERVER['document_root']."/upload/".basename($_FILES["file"]["name"]);
if(move_uploaded_file($stored_path . $_FILES["file"]["name"])){
echo "Stored in: " . $stored_path;
}else{
echo 'Stored failed:file save error';
}
} echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}else{
echo "Error:" .$_FILES["file"]["error"];
}
}else{
echo "Invalid file";
}
?>


其中 move_uploaded_file() 函数将上传的文件移动到新位置。成功返回true,失败返回false
move_uploaded_file(file,newloc)  如果目标文件已经存在,将会被覆盖
参数 描述
file 必需。规定要移动的文件。
newloc 必需。规定文件的新位置。
 
is_uploaded_file($file)

该函数可以用于确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。


这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。

原创作品,转载请注明出处!

 

php中$_FILES应用实例的更多相关文章

  1. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

  2. [Effective JavaScript 笔记]第36条:只将实例状态存储在实例对象中

    理解原型对象与其实例之间是一对多的关系,对于实现正确的对象行为很重要.常见的错误是不小心将每个实例的数据存储到了其原型中. 示例 一个实现了树型数据结构的类可能将子节点存储在数组中. 实例状态在原型中 ...

  3. 上传文件及$_FILES的用法实例

    Session变量($_SESSION):�php的SESSION函数产生的数据,都以超全局变量的方式,存放在$_SESSION变量中.1.Session简介SESSION也称为会话期,其是存储在服务 ...

  4. iOS比较常用的第三方及实例(不断更新中)

    把平时看到或项目用到的一些插件进行整理,文章后面分享一些不错的实例,若你有其它的插件欢迎分享,不断的进行更新: 一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com ...

  5. 将oracle冷备份恢复到另外一个数据库实例中

    因更换服务器需要将Oracle数据库转移到另外台Oracle中.说明: 1.测试环境为:windows server2003 和 oracle 10g. 2.2台服务器安装的程序目录一样,数据目录不一 ...

  6. openstack将本地实例迁移至ceph存储中

    需求: 最近在openstack上线了ceph存储,创建虚拟机和云硬盘都基于ceph卷进行存储和创建,但是之前openstack用的是本地存储,创建的所有实例都在本地文件中,当实例重启之后,opens ...

  7. PHP实例:使用PHPExcel导入Excel2003文档和Excel2007文档到MySQL数据库中

    如果要使用phpExcelReader将Excel 数据导入到mysql 数据库,请读者点击这个文章查看. 使用phpExcelReader将Excel 数据导入到mysql 数据库. 下面我们介绍另 ...

  8. MVC之在实例中的应用

    MVC模式在Java Web应用程序中的实例分析 1. 结合六个基本质量属性 1)可用性 2)可修改性 3)性能 4)安全性 5)可测试性 6)易用性 2. 分析具体功能模块的MVC设计实现(例如登录 ...

  9. 实例解说AngularJS在自动化测试中的应用

    一.什么是AngularJS ? 1.AngularJS是一组用来开发web页面的框架.模板以及数据绑定和丰富UI的组件: 2.AngularJS提供了一系列健壮的功能,以及将代码隔离成模块的方法: ...

随机推荐

  1. BottomSheet底部动作条使用

    底部动作条 底部动作条(Bottom Sheets)是一个从屏幕底部边缘向上滑出的一个面板,使用这种方式向用户呈现一组功能.底部动作条呈现了简单.清晰.无需额外解释的一组操作. 使用环境 底部动作条( ...

  2. 高通 8x12 添加 TP和按键

    1 .在tp的驱动文件中添加以下代码实现按键功能 [plain] view plain copy static ssize_t ft5x06_virtual_keys_register(struct  ...

  3. 3、使用Gradle创建Libgdx项目

    (原文链接:http://www.libgdx.cn/topic/20/3-%E4%BD%BF%E7%94%A8gradle%E5%88%9B%E5%BB%BAlibgdx%E9%A1%B9%E7%9 ...

  4. Android官方技术文档翻译——Eclilpse项目迁移

    本文译自Android官方技术文档<Migrating From Eclipse Projects>,原文地址:http://tools.android.com/tech-docs/new ...

  5. 证书,CSP与Openssl

    证书,CSP与Openssl 起因 最近在研究更安全的交互体系,自然想到的就是提供证书的交互方式.给用户分配一对公私钥,然后将私钥交给用户保管,用户在登录或者一些关键操作的时候通过私钥签名,从而保证其 ...

  6. 典型分布式系统分析: GFS

    本文是典型分布式系统分析系列的第二篇,关注的是GFS,一个分布式文件存储系统.在前面介绍MapReduce的时候也提到,MapReduce的原始输入文件和最终输出都是存放在GFS上的,GFS保证了数据 ...

  7. 关于hashCode与equals

    首先我得说明,在我们自己写得类中你可以复写这两个方法,此时从语法的角度来说,他们没关系. 在object中 public native int hashCode(); public boolean e ...

  8. Mybatis的resultType

    使用mybatis去查询数据时,没有指定resultType,mybatis无法返回正常结果,当然在web中并没有出现报错,所以有点坑自己了,所以需要使用如下配置: <select id=&qu ...

  9. RTMPdump(libRTMP) 源代码分析 5: 建立一个流媒体连接 (NetConnection部分)

    ===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...

  10. HBase集群部署脚本

    #!/bin/bash # Sync HBASE_HOME across the cluster. Must run on master using HBase owner user. HBASE_H ...