PHP中使用文件上传涉及到的一些参数:

  1. 开启file_uploads

  2. 设置upload_tmp_dir

   upload_tmp_dir用来说明PHP上传的文件放置的临时目录,要想上传文件,得保证服务器没有关闭临时文件和有对文件夹的写权限;

   如果upload_tmp_dir未指定,Windows下会使用系统环境变量中TMP或者TEMP变量设置的路径。

    

  3. 设置upload_max_filesize

   设置允许上传的文件的最大大小,与其相关的还有post_max_size和memory_limit;post_max_size用来控制在采用POST方法进行一次表单提交中PHP所能够接收的最大数据量,如果希望使用PHP文件上传功能,则需要将此值改为比upload_max_filesize要大;memory_limit指定单个脚本程序可以使用的最大内存容量变量memory_limit的值应当适当大于post_max_size的值。

    一般在客户端通过一个隐藏域设置MAX_FILE_SIZE,这样可以在浏览器端就拦截掉超过限制大小的文件,但是可以被用户绕过,所以不能仅依赖于客户端的限制,在PHP中接收文件时任然需要对文件大小进行判断。

  4. 设置max_input_time

   max_input_time以秒为单位对通过POST、GET以及PUT方式接收数据时间进行限制。如果upload_max_filesize设置得比较大,或者考虑到用户的网速比较慢,则需要增加此值以适应接收数据所需的更多时间。

  5. 设置max_execution_time

   max_execution_time设置了在强制终止脚本前PHP等待脚本执行完毕的时间,此时间以秒计算。当脚本进入了一个无限循环状态时此变量非常有用。然而,当存在一个需要很长时间完成的合法活动时(例如上传大型文件),这项功能也会导致操作失败。在这样的情况下必须考虑将此变量值增加,以避免PHP在脚本正在执行某些重要过程的时候将脚本关闭。

 

 

  文件上传后,在全局变量 $_FILES中可以得到与上传文件相关的一些信息,假设上传表单中文件域的字段名称为'userfile',则可以得到如下信息:

  1. $_FILES['userfile']['name']    客户端机器文件的原名称
  2. $_FILES['userfile']['type']    文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值。
  3. $_FILES['userfile']['size']    已上传文件的大小,单位为字节,值得注意的是
  4. $_FILES['userfile']['tmp_name']    文件被上传后在服务端储存的临时文件名。
  5. $_FILES['userfile']['error']    和该文件上传相关的错误代码。点此查看错误代码列表。

 如果有多个文件域,可以给每个文件域设置不同的字段名称,也可以将字段名称设置成一个数组,例如'userfile[]',此时$_FILES['userfile']中的每一项都是一个数组,分别对应每个文件域。

 

PHP接收上传文件时也需要做一些判断:

  1. 使用is_uploaded_file判断给出的文件是否是通过POST方法上传的,这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。

   is_uploaded_file的参数应该为类似于 $_FILES['userfile']['tmp_name'] 的变量,即在服务器端的临时文件。

  2. 判断文件大小、类型等等

    值得注意的是,$_FILES['userfile']['size'] 中返回的是文件的大小,而不是文件的占用空间。

 

下面是一个例子,功能是上传两个文件,一个原始文件,一个水印文件,将水印文件合并到原始文件右下角。

HTML:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<form enctype="multipart/form-data" method="post" action="upload.php">
<label>原始图片</label><input type="file" name="file[]"/><br />
<label>水印图片</label><input type="file" name="file[]"/><br />
<input type="submit" value="提交"/>
</form>
</body>
</html>

PHP:

<?php

$uploadfiles = $_FILES['file'];
$keys = array_keys($uploadfiles['name']);
foreach($keys as $key){
if(!is_uploaded_file($uploadfiles['tmp_name'][$key])){
echo '非法!';
exit();
}
}
if($uploadfiles['size'][1] > 26302){
echo '水印图片太大';
exit();
}
header("Content-type: image/png");

$dst = imagecreatefromjpeg($uploadfiles['tmp_name'][0]);
$src = imagecreatefrompng($uploadfiles['tmp_name'][1]);

$dst_h = imagesy($dst);
$dst_w = imagesx($dst);

$src_h = imagesy($src);
$src_w = imagesx($src);

imagecopyresampled($dst, $src, $dst_w - $src_w + 20, $dst_h - $src_h + 20, 0, 0, $src_w - 20, $src_h - 20, $src_w, $src_h);

imagepng($dst);
imagedestroy($dst);
?>
posted on 2011-11-11 16:15  成阳~  阅读(577)  评论(0编辑  收藏  举报