$_FILES文件上传(html+php代码)
在B/S程序中文件上传已经成为一个常用功能。其目的是客户可以通过浏览器(Browser)将文件上传到服务器(Server)上的指定目录。 PHP中文件上传的基础知识: 客户端form表单 服务器端对上传文件的操作
一、客户端文件上传的form表单:
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="up.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
选择文件:<input type="file" name="myfile">
<input type="submit" value="上传文件">
</form>
</body>
</html>
二、
1、POST方法: 表单最常用的功能,向目标页面传递变量,我们在上传文件的时候,会在表单中设置相应的属性,来完成文件的传递
2、enctype="multipart/form-data" 这样服务器就会知道,我们要传递一个文件,这样服务器可以知道上载的文件带有常规的表单信息。
3、MAX_FILE_SIZE 此字段必须在文件输入字段之前,控制最大的传递文件的大小(字节)
4、<input type="file" name="userfile"> 设置浏览器文件输入浏览按钮
5、file_uploads ON 是否开启文件上传
6、upload_max_filesize 64M 限制PHP处理上传文件大小的最大值,PHP5.3版本默认是2M
7、post_max_size 3M 限制通过POST方法可以接受信息的最大值,也就是整个POST请求的提交值。PHP5.3版本默认是8M 设置的值>upload_max_filesize
8、upload_tmp_dir d:/wamp/tmp 上传文件存放的临时路径,可以是绝对路径。值NULL则使用系统的临时目录。
9、超级全局数组$_FILES :
1、$_FILES["myfile"]["name"]中的值是: 客户端文件系统的文件的名称
2、$_FILES["myfile"]["type"]中的值是: 客户端传递的文件的类型
3、$_FILES["myfile"]["size"]中的值是: 文件的字节的大小
4、$_FILES["myfile"]["tmp_name"]中的值是: 文件被上传后在服务器存储的临时全路径
5、$_FILES["myfile"]["error"]中的值是: 文件上传的错误代码-php 4.2以后增加的功能
10、伴随文件上传时产生的错误信息代码是在PHP4.2.0版本中引入的,具体如下:
1、值为0:表示没有发生任何错误。
2、值为1:表示上传文件的大小超出了约定值。文件大小的最大值是在PHP配置文件中指定的,该指令是: upload_max_filesize。
3、值为2:表示上传文件大小超出了HTML表单隐藏域属性的MAX_FILE_SIZE元素所指定的最大值。
4、值为3:表示文件只被部分上传。
5、值为4:表示没有上传任何文件。
6、值为6:表示找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
7、 值为7:表示文件写入失败。PHP 5.1.0 引进。
11、文件类型 MIME类型
1、 图片文件 image/gif,image/jpg,image/jpeg,image/png,image/x-png
2、纯文本和HTML text/txt,text/plain,text/html
3、二进制文件 application/octet-stream
4、音频格式 audio/basic
5、视频格式 video/mpeg
12、获取$_FILES超全局变量判断是否有值; 判断错误:$_FILES[‘myfile’][‘error’];
13、判断上传文件扩展名是否符合要求:$_FILES[‘myfile’][‘name’]中获取
14、判断上传文件大小是否符合要求:$_FILES[‘myfile’][‘size’]单位字节;
15、设置保存服务器上的新文件名包含扩展名:date(‘YmdHis’); 新文件保存位置目录是否存在,不存在需要新建目录:mkdir;
16、复制或移动临时文件到指定位置保存:move_uploaded_file ;
PHP数据处理代码实现:
(第一种)function file_upload(){
$date = date("Y-m-d");//当前凌晨时间
$dir = DOC_ROOT . "/Public/Uploads/".$date;//保存的路径
if (!file_exists($dir)) {//创建文件夹
mkdir($dir, 0777, true);
}
if ($_FILES["file"]["error"]) {
return $_FILES["file"]["error"];
}else{
//图片上传
if (($_FILES["file"]["type"] == "image/png" || $_FILES["file"]["type"] == "image/jpeg" || $_FILES["file"]["type"] == "image/gif" || $_FILES["file"]["type"] == "image/jpg") && $_FILES["file"]["size"] < 5000000) {
$images = $_FILES['file']['name'];
$savePath = "/Public/Uploads/" .$date ."/";
$saveName = $images;//savename
//存入文件夹中
$res = move_uploaded_file($_FILES["file"]["tmp_name"], $_SERVER['DOCUMENT_ROOT'] . "/secondbear" . $savePath . $saveName);
if ($res === false) {
return (array('code' => 300, 'msg' => '文件添加失败'));
}else{
//图片保存成功
$where['savepath'] = $date . "/";
$where['savename'] = $saveName;
$where['time'] = time();
$where['type'] = $_FILES["file"]["type"];
$fileList_id = M('file')->add($where);
return $fileList_id;
}
} else {
return (array('code' => 400, 'msg' => '文件过大或文件格式不正确'));
}
}
}
(第二种)
public function upload()
{
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728;// 设置附件上传大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './Public/Uploads/'; // 设置附件上传根目录
$upload->savePath = ''; // 设置附件上传(子)目录
// 上传文件
$info = $upload->upload();
if (!$info) {// 上传错误提示错误信息
return $upload->getError();
} else {// 上传成功
return $info;
}
}
第二种:引用TP3.2类,但是有一个问题就是在传PNG透明背景时,上传的图片会变黑,空白会填满,这主要是TP3.2中的gd类少了对PNG的判断因此解决如下: