php文件上传详解

时间:2022-09-30 15:14:23

一、上传文件首先要在php.ini里按自己的需求进行相应配置

有以下几个重要的配置单:

选项

默认值

说明

post_max_size

8M

控制以后的POST请求的最大规模。必须大于upload_max_filesize选项值。

max_input_time

60

指定一个POST请求提交所有数据可以花费的时间。以秒为单位。在此时间之后结束数据提交。

memory_limit

128M

一个脚本页所能消耗的最大内存。

max_execution_time

30

脚本最大执行时间。以秒为单位。

file_uploads

On

指出是否允许文件上传。默认值为on

upload_max_filesize

2M

控制PHP接受的最大文件规模。如果文件太大,PHP就写入一个0字节的占位符文件。

upload_tmp_dir

NULL

必须设置为一个有效目录。可以将上传的文件放在这里等候处理。

1. 一般的php文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.
但在php中,默认的该页最久执行时间为 30 秒.就是说超过30秒,该脚本就停止执行.
这就导致出现 无法打开网页的情况.这时我们可以修改 max_execution_time
在php.ini里查找
max_execution_time
默认是30秒.改为
max_execution_time = 0  0表示没有限制
以上修改的是php上传文件中脚本执行超时时间


2. 修改 post_max_size 设定 POST 数据所允许的最大大小。此设定也影响到php上传文件。
php默认的post_max_size 为2M.如果 POST 数据尺寸大于 post_max_size $_POST 和 $_FILES superglobals 便会为空.
查找 post_max_size .改为
post_max_size = 150M


3. 很多人都会改了第二步.但php上传文件时最大仍然为 8M.
为什么呢.我们还要改一个参数upload_max_filesize 表示所上传的文件的最大大小。
查找upload_max_filesize,默认为8M改为
upload_max_filesize = 100M
另外要说明的是在php文件上传中,post_max_size 大于 upload_max_filesize 为佳.

二、在HTML表单中设置上传

需要注意三个地方:

  1. 将form表单提交方式设为POST
  2. 添加一个“file”类型的<input>标签(如果是多文件上传,添加多个)
  3. 将enctype属性添加到表单中,表示将使用新的multipart/form-data MIME类型。

提交数据以后,服务器通过超级全局数组$_FILES访问提交的文件。这个数组包含的元素个数为表单file个数相同。例如:如果表单里有一个上传文件的选框:

<input type=”file” name=”filename”>

当提交数据后,可以通过$_FILES[‘filename’]来取得这个文件的信息。该信息如下:

$_FILES[‘filename’]

       [‘name’]  =>   文件名

       [‘type’]   =>   文件MIME类型。如image/jpeg, text/plain, application/octet-stream等。

       [‘tmp_name’] => 如果文件小于允许上传文件大小,则该位置表示上传的文件临时存放路径及临时文件名,被放在upload_tmp_dir所指定的位置。

       [‘error’] =>    错误代码。

       [‘size’] =>      文件大小。

其中error错误代码可能的值如下表:

编码

说明

UPLOAD_ERR_OK

0

文件成功上传

UPLOAD_ERR_INI_SIZE

1

文件大小比php.iniupload_max_filesize指定值要大

UPLOAD_ERR_FORM_SIZE

2

文件的 小比表单的MAX_FILE_SIZE指定的值大

UPLOAD_ERR_PARTIAL

3

文件上传不完整(可能因为请求时间过长被终止)

UPLOAD_ERR_NO_FILE

4

没有文件随着这个请求上传

UPLOAD_ERR_NO_TMP_DIR

6

php.ini中没有指定临时文件夹

只有当$_FILES[‘filename’][‘error’]的值为0时,才应该继续处理文件。

单文件上传HTML结构示例:

<form action="" method="post" enctype="multipart/form-data">
<p>File:
<input type="file" name="filename" />
<input type="submit" value="Send" />
</p>
</form>

多文件上传HTML结构示例:

<form action="" method="post" enctype="multipart/form-data">
<p>Files:
<input type="file" name="filename[]" />
<input type="file" name="filename[]" />
<input type="file" name="filename[]" />
<input type="submit" value="Send" />
</p>
</form>

三、php服务端对数据进行处理

像文件大小和类型限制、分目录存储、文件信息入库等操作,都可以根据需要自行处理,这里给一个简单的例子:

 

include_once 'conn/conn.php';
$filename = $_FILES['filename']['name'];//读取上传文件名,并存为数组
$filetype = $_POST['foundtype'];//读取上传文件的类别
$tmpname = $_FILES['filename']['tmp_name'];//读取临时文件名,并存为数组
$tmpsize = $_FILES['filename']['size'];//上传文件大小
$tmppub = $_POST['ispub'];//是否公开
$file_path = 'upfile/';
$max = 0;
if(!is_null($tmpsize)){
foreach($tmpsize as $value){
$max += $value;
}
if($max > 100000000 or $max <= 0){
echo '<script>alert("上传文件总大小大于100M,请重新选择1");location="'.$_SERVER['HTTP_REFERER'].'";</script>';
}
}else{
/*var_dump($tmpsize);
exit();*/
echo '<script>alert("上传文件错误,请重新检查程序");location="'.$_SERVER['HTTP_REFERER'].'";</script>';
}
$chkdownnum = '';
for($i = 0; $i < 15; $i++){
$chkdownnum .= dechex(rand(0,15));
}
for ($i = 0; $i < count($filename); $i++){//通过循环将多个文件全部上传
move_uploaded_file($tmpname[$i],$file_path.$filename[$i]);
//添加进数据库
$insertsql = 'insert into tb_upfile (filename,filepath,filetype,upauthor,chkdownnum,ispub) values("'.trim($filename[$i]).'","'.$file_path.$filename[$i].'","'.$filetype[$i].'","'.$_SESSION['name'].'","'.trim($chkdownnum).'",'.$tmppub[$i].')';
$conne->uidRst($insertsql);
}
echo '<div style=" padding-top: 30px;">文件上传成功!</div>';

这里推荐几个蛮好用的jquery插件:
uploadify(flash版/html5版) jQuery File Upload (html5) plupload(多种runtime支持)