PHP单文件上传原理及上传函数的封装

<?php
//单文件上传函数的封装
//文件上传原理:将客户端的文件上传到服务器端,再将服务器端的临时文件移动到指定目录即可。
//文件的方向:客户端——>服务器(临时文件)——>指定目录,当文件进入服务器时它就是临时文件了,这时操作中要用临时文件的名称tmp_name。
//在客户端设置上传文件的限制(文件类型和大小)是不安全的,因为客户能通过源代码修改限制,所以在服务端这里设置限制。
//设置编码为UTF-8,以避免中文乱码
header('Content-Type:text/html;charset=utf-8');
//通过$_FILES接收上传文件的信息
$fileInfo = $_FILES['myFile'];
function uploadFile($fileInfo,$uploadPath='uploads',$flag=true,$allowExt=array('jpeg','jpg','png','gif'),$maxSize = 2097152){
//判断错误号,只有为0或者是UPLOAD_ERR_OK,没有错误发生,上传成功
	if($fileInfo['error']>0){
		//注意!错误信息没有5
		switch($fileInfo['error']){
			case 1:
				$mes= '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
				break;
			case 2:
				$mes= '超过了HTML表单MAX_FILE_SIZE限制的大小';
				break;
			case 3:
				$mes= '文件部分被上传';
				break;
			case 4:
				$mes= '没有选择上传文件';
				break;
			case 6:
				$mes= '没有找到临时目录';
				break;
			case 7:
				$mes= '文件写入失败';
				break;
			case 8:
				$mes= '上传的文件被PHP扩展程序中断';
				break;

		}
		exit($mes);
	}
	$ext=pathinfo($fileInfo['name'],PATHINFO_EXTENSION);
	//$allowExt=array('jpeg','jpg','png','gif');

	//检测上传文件的类型
	if(in_array($ext,$allowExt)){
		exit('非法文件类型');
	}

	//检测上传文的件大小是否符合规范
	//$maxSize = 2097152;//2M
	if($fileInfo['size']>$maxSize){
		exit('上传文件过大');
	}

	//检测图片是否为真实的图片类型
	//$flag=true;
	if($flag){
		if(!getimagesize($fileInfo['tmp_name'])){
			exit('不是真实的图片类型');
		}
	}

	//检测是否是通过HTTP POST方式上传上来
	if(!is_uploaded_file($fileInfo['tmp_name'])){
		exit('文件不是通过HTTP POST方式上传上来的');
	}

	//$uploadPath='uploads';
	//如果没有这个文件夹,那么就创建一个
	if(!file_exists($uploadPath)){
		mkdir( $uploadPath, 0777, true);
		chmod( $uploadPath, 0777 );
	}
	//新文件名唯一
	$uniName = md5 ( uniqid( microtime(true),true) ).'.'.$ext;
	$destination = $uploadPath.'/'.$uniName;
	//@符号是为了不让客户看到错误信息
	if(! @move_uploaded_file($fileInfo['tmp_name'], $destination )){
		exit('文件移动失败');
	}

	//echo '文件上传成功';
	//return array(
	//	'newName'=>$destination,
	//	'size'=>$fileInfo['size'],
	//	'type'=>$fileInfo['type']
	//);
	return $destination;
}
?>
时间: 2024-11-04 04:07:44

PHP单文件上传原理及上传函数的封装的相关文章

[转]文件上传原理:Web上传文件的原理及实现

现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的CommonsFileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2在底层也使用了CommonsFileUpload).在asp.net中也有相应的上传文件的控件. 虽然现在有很多上传组件可以利用,但是了解Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理.在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件

HTTP上传 文件上传 图片上传 HTTP上传原理 文件上传原理 图片上传原理

1.概述 在最初的http协议中,没有上传文件方面的功能.rfc1867(http://www.ietf.org/rfc/rfc1867.txt )为http协议添加了这个功能.浏览器按照此规范将用户指定的文件发送到服务器.服务器再按照此规范,解析出文件.大部分的http server都支持此协议,比如tomcat(本文用的是Spring MVC,即HttpServelet来接收请求). 网上很多博客,以及插件的做法,是建一个iframe用户无刷新请求,再建一个form用于提交.但其实可以直接用

git---怎样将分支上的一个单文件合并到主分支上(master)

一.首先切换到主分支  注意将分支上的数据全部提交 以免造成数据冲突或丢失 git checkeout master 二.选择要合并的文件 git checkout --patch 分支名称  要合并的文件路径 三.此时文件将合并完成 最重要的一步一定是 提交 git add -A 文件路径 git commit -m '注释' git push 如果不想合并只是测试  一定要回滚回来 git reset --hard origin/master 到上一个版本 原文地址:https://www.

Struts2单文件上传原理及示例

一.文件上传的原理 表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值: 1.application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式. 2.multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里. 3.text/plain:这种方式主要适用于直接通过表单发送邮件的

atitit.ajax上传文件的实现原理 与设计

atitit.ajax上传文件的实现原理 与设计 1. 上传文件的三大难题 1 1.1. 本地预览 1 1.2. 无刷新 1 1.3. 进度显示 1 2.  传统的html4  + ajax 是无法直接实现上传文件 1 2.1. 传统的实现方式iframe 2 2.2. html5转码base64 3 2.3. 其它插件FLASH的实现原理 3 3. 上传进度的实现原理 3 3.1. 使用ajax结合服务端的进度返回,比較麻烦 4 4. 本地预览的解决 4 4.1. 用HTML5上传文件 4 5

Ueditor1.4.3实现跨域上传到独立文件服务器,完美解决单文件和多文件上传!

再写配置方法之前先吐槽一下网上的各种教程,TM没一个有卵用,一群傻屌不会写就别写,写了就要负责. 百度google搜了半天,全是配置什么document.domain,根域名什么的,我只想对你说: 好了,talk is cheap show me the code,言归正传: 首先去ue官网下载1.43版 .net版本,解压之后,把demo文件夹改成web,把net那个文件夹拷贝出来放到web外面,如图: 这样就把编辑器的静态文件和动态文件分离了,动态部分放到文件服务器上,静态部分集成到我们的网

Web文件上传原理

采用WEB技术实现B/S(浏览器/服务器)结构的管理系统是办公自动化的发展趋势.基于WEB技术的管理系统,由于开发周期短:与用户平台无关:易于实现交互式应用:能对信息进行快速.高效的收集.处理和发布,近几年来得到了迅速发展.而ASP技术由于其开发效率高.交互性好,安全性强等特点,逐渐成为开发管理系统的首选工具. 许多基于WEB的应用都涉及文件上传操作.常见的文件上传技术有:基于HTTP协议的:基于VB(或DELPHI等编程语言)开发的文件上传组件的:基于数据库技术的等等.这些方法一般都需要编程者

php文件上传原理详解(含源码)

1.文件上传原理 将客户端的文件上传到服务器,再将服务器的临时文件上传到指定目录 2.客户端配置 提交表单 表单的发送方式为post 添加enctype="multipart/form-data" 3.服务器端配置 file_uploads = On,支持HTTP上传 uoload_tmp_dir = ,临时文件保存目录 upload_max_filesize = 2M,允许上传文件的最大值 max_file_uploads = 20 ,允许一次上传到的最大文件数 post_max_s

根据百度网盘的上传原理,自己写大文件上传

在之前大文件的上传我都是通过FilderReader获取文件的base64然后转为Blob在一段一段截取上传,但是这个方法有个弊端就是很大的文件的时候获取文件的base64会使整个浏览器崩溃卡死,后面我去看了一下百度网盘的上传原理 我们可以看到百度是通过类似表单提交的方式上传文件的,这样子似乎不需要把文件转化为base64减少了浏览器的开销.那个让我们来动手做一个大文件上传吧 这里用input标签来获取需要上传的文件 获取到file对象以后我们就可以得到 这样一个对象里面就是文件的大小名字等信息