我想让大家帮我改改手册中的文件上传处理,我想看看大家写成类时,大概思路是怎么样的?
代码如下:例子 38-2. 使文件上传生效请查阅函数 is_uploaded_file() 和 move_uploaded_file() 以获取进一步的信息。以下范例处理由表单提供的文件上传。 <?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.$uploaddir = ' ar/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}echo 'Here is some more debugging info:';
print_r($_FILES);print "</pre>";?>  麻烦了

解决方案 »

  1.   

    <?php
    // In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
    // of $_FILES.
    class Uploads 
    {
    var $uploaddir;
    var $uploadfile; function Uploads($a,$b) 
    {
    $this->uploaddir = $a;
    $this->uploadfile = $a . basename($b['name']);
    $this->movefile($b);
    }
    function movefile($b)
    {
    if (move_uploaded_file($b['tmp_name'], $uploadfile)) 
    {
         echo "File is valid, and was successfully uploaded.\n";

    else 
    {
         echo "Possible file upload attack!\n";
    }
    }
    }
    ?><?
    $shuizhe = new Uploads('/up/',$_FILES[$_POST['file']]);
    ?> 上传没有成功 上传完毕后 总输出这句Possible file upload attack!
      

  2.   

    <?php/**
     * 提供对文件上传的的封装处理 
     *
     * 
     *
     * @package    Plite.Lib
     * @author     ice_berg16(寻梦的稻草人)
     * @copyright  2004-2006 [email protected]
     * @version    $Id: FileUploader.php 160 2006-12-30 08:04:31Z icesyc $
     */class FileUploader
    {
    //保存所有的上传文件列表
    private $files = array(); /**
     * 构造函数 
     *
     * 将上传文件的数据保存在数组中,对于同名的数组,则分别产生新的序列
     * 如<input type='file' name='file[]'/>
     * <input type='file' name='file[]'/>
     * 产生file1, file2的对应数组
     */
    public function __construct()
    {
    foreach($_FILES as $key => $info)
    {
    if(is_array($info['name']))
    {
    foreach($info['name'] as $k => $v)
    {
    $inf = array(
    "name" => $info['name'][$k],
    "type" => $info['type'][$k],
    "tmp_name" => $info['tmp_name'][$k],
    "error" => $info['error'][$k],
    "size" => $info['size'][$k]
    );
    $this->files[$key.$k] = new UploadFile($inf);
    }
    }
    else
    $this->files[$key] = new UploadFile($info);
    }
    } /**
     * 返回指定名称的上传文件对象 
     *
     * @param @string $name
     * @return UploadFile对象
     */
    public function getFile($name)
    {
    if(isset($this->files[$name]))
    return $this->files[$name];
    return null;
    } /**
     * 返回所有的上传文件对象数组 
     *
     * @return Array
     */
    public function getFiles()
    {
    return $this->files;
    } /**
     * 将所有的上传文件移动到指定文件夹 
     *
     * @param $dir 要移动的目录
     * @flag int OLD_NAME代表使用原来的文件名, RANDOM_NAME代表使用随机的文件名
     *
     * @return 返回一个路径列表
     */
    public function move($dir, $flag=UploadFile::FILE_OLD_NAME)
    {
    foreach($this->files as $f)
    {
    if($n = $f->move($dir, $flag))
    $path[] = $n;
    }
    return $path;
    }
    }/**
     * 封装一个上传文件对象
     *
     * UploadFile是配合FileUploader一起使用的,单独使用时要注意
     * 初始化时要将用$_FILES['filename']来构造,并且filename不能是数组
     * $uf = new UploadFile($_FILES['filename']);
     *
     *
     * @package    Plite.Lib
     * @author     ice_berg16(寻梦的稻草人)
     * @copyright  2004-2006 [email protected]
     * @version    $Id: FileUploader.php 160 2006-12-30 08:04:31Z icesyc $
     */class UploadFile
    {
    //保存上传文件的信息数组
    private $file;
      
    //移动时使用原始文件名
    const FILE_OLD_NAME = 1; //移动时使用随机文件名
    const FILE_RANDOM_NAME = 2; //构造函数
    public function __construct($file)
    {
    $this->file = $file;
    } /**
     * 移动上传文件 
     *
     * 可以使用UploadFile::FILE_RANDOM_NAME,UploadFile::FILE_OLD_NAME作为文件名
     * 分别为随机名,原始文件名,使用新的文件名时要包括扩展名
     *
     * @param string $dir 目标目录
     * @param int|string name 
     * @param string $prefix 文件名的前缀
     * @return 如果成功返回上传后的新路径,否则返回false
     */
    public function move($path, $name=self::FILE_OLD_NAME, $prefix='')
    {
    if(substr($path,-1) != "/" || substr($path,-1) != "\\")
    $path .= "/";
    if($name == self::FILE_RANDOM_NAME)
    $path .= uniqid($prefix) . "." . $this->getExt();
    elseif($name == self::FILE_OLD_NAME)
    $path .= $prefix . $this->getName();
    else
    $path .= $prefix . $name;
    if(file_exists($path))
    throw new Exception("要上传的文件已经存在于目录中 => $path");
    if(move_uploaded_file($this->file['tmp_name'], $path))
    return $path;
    return false;
    }

    //文件是否上传成功
    public function uploadOK()
    {
    return $this->file['error'] == UPLOAD_ERR_OK;
    } //取得扩展名
    public function getExt()
    {
    return pathinfo($this->file['name'], PATHINFO_EXTENSION);
    }

    //使用魔法函数来取得文件的一些信息
    public function __call($method, $arg)
    {
    if(substr($method,0,3) == "get")
    {
    $attr = strtolower(substr($method,3));
    if(isset($this->file[$attr]))
    return $this->file[$attr];
    else
    return null;
    }
    return false;
    }
    }
    ?>