多个上传到多个文件夹 - PHP

时间:2014-05-24 02:39:55

标签: php file-upload upload

我正在尝试将多个文件上传到多个文件夹中。不幸的是,收效甚微。

非常感谢任何帮助

我有两个表单字段:

<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max; ?>" />
<input name="menu" type="file" class="input_event noBorder" title="Upload Menu" />


<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max; ?>" />
<input name="img" type="file" class="input_event noBorder" title="Upload Img" />

我想使用一个上传图片,另一个上传pdf和/或word文档。 我还希望将这两个文件保存到相应的文件夹中(/ imgs和/ docs)。

我尝试过的一些事情

  • 尝试过两个,每个都指向正确的路径
  • 尝试了多个类来处理每个文件
  • 已将数组括号添加到输入名称字段(例如:name="menu[]"

我想我需要改变班级本身的某些事情;然而,我正在学习PHP,这个课程是从3本书,几十个Google搜索以及我在堆栈中找到的一些帖子拼凑而成的。

正是我需要改变的东西还远远超出了我。

页面PHP代码的相关部分:

$max = 400000;
if (isset($_POST['submit'])) { //MAIN IF STATEMENT  

$destination = './uploads/menus_up/';
try {
$upload = new Upload_File($destination);
$upload->move();
$result = $upload->getMessages();
} catch (Exception $e) {
echo $e->getMessage();
}

上传课程

class Upload_File {

    protected $_uploaded = array();
    protected $_destination;
    protected $_max = 400000;
    protected $_messages = array();
    protected $_permitted = array('image/gif',
                                'image/jpeg',
                                'image/pjpeg',
                                'image/png');
    protected $_renamed = false;

    public function __construct($path) {
    if (!is_dir($path) || !is_writable($path)) {
        throw new Exception("$path must be a valid, writable directory.");
    }
    $this->_destination = $path;
    $this->_uploaded = $_FILES;
    }

    public function getMaxSize() {
    return number_format($this->_max/1024, 1) . 'kB';
    }

    public function setMaxSize($num) {
    if (!is_numeric($num)) {
        throw new Exception("Maximum size must be a number.");
    }
    $this->_max = (int) $num;
    }

    public function move($overwrite = false) {
    $field = current($this->_uploaded);
    if (is_array($field['name'])) {
        foreach ($field['name'] as $number => $filename) {
        // process multiple upload
        $this->_renamed = false;
        $this->processFile($filename, $field['error'][$number], $field['size'][$number], $field['type'][$number], $field['tmp_name'][$number], $overwrite); 
        }
    } else {
        $this->processFile($field['name'], $field['error'], $field['size'], $field['type'], $field['tmp_name'], $overwrite);
    }
    }

    public function getMessages() {
    return $this->_messages;
    }

    protected function checkError($filename, $error) {
    switch ($error) {
        case 0:
        return true;
        case 1:
        case 2:
            $this->_messages[] = "$filename exceeds maximum size: " . $this->getMaxSize();
        return true;
        case 3:
        $this->_messages[] = "Error uploading $filename. Please try again.";
        return false;
        case 4:
        $this->_messages[] = 'No file selected.';
        return false;
        default:
        $this->_messages[] = "System error uploading $filename. Contact webmaster.";
        return false;
    }
    }

    protected function checkSize($filename, $size) {
    if ($size == 0) {
        return false;
    } elseif ($size > $this->_max) {
        $this->_messages[] = "$filename exceeds maximum size: " . $this->getMaxSize();
        return false;
    } else {
        return true;
    }
    }

    protected function checkType($filename, $type) {
    if (empty($type)) {
        return false;
    } elseif (!in_array($type, $this->_permitted)) {
        $this->_messages[] = "$filename is not a permitted type of file.";
        return false;
    } else {
        return true;
    }
    }

    public function addPermittedTypes($types) {
    $types = (array) $types;
        $this->isValidMime($types);
    $this->_permitted = array_merge($this->_permitted, $types);
    }

    protected function isValidMime($types) {
        $alsoValid = array('image/tiff',
                             'application/pdf',
                             'application/msword');
        $valid = array_merge($this->_permitted, $alsoValid);
    foreach ($types as $type) {
        if (!in_array($type, $valid)) {
        throw new Exception("$type is not a permitted MIME type");
        }
    }
    }

    protected function checkName($name, $overwrite) {
    $nospaces = str_replace(' ', '_', $name);
    if ($nospaces != $name) {
        $this->_renamed = true;
    }
    if (!$overwrite) {
        $existing = scandir($this->_destination);
        if (in_array($nospaces, $existing)) {
        $dot = strrpos($nospaces, '.');
        if ($dot) {
            $base = substr($nospaces, 0, $dot);
            $extension = substr($nospaces, $dot);
        } else {
            $base = $nospaces;
            $extension = '';
        }
        $i = 1;
        do {
            $nospaces = $base . '_' . $i++ . $extension;
        } while (in_array($nospaces, $existing));
        $this->_renamed = true;
        }
    }
    return $nospaces;
    }

    protected function processFile($filename, $error, $size, $type, $tmp_name, $overwrite) {
    $OK = $this->checkError($filename, $error);
    if ($OK) {
        $sizeOK = $this->checkSize($filename, $size);
        $typeOK = $this->checkType($filename, $type);
        if ($sizeOK && $typeOK) {
        $name = $this->checkName($filename, $overwrite);
        $success = move_uploaded_file($tmp_name, $this->_destination . $name);
        if ($success) {
            $message = "$filename uploaded successfully";
            if ($this->_renamed) {
                $message .= " and renamed $name";
            }
            $this->_messages[] = $message;
        } else {
            $this->_messages[] = "Could not upload $filename";
        }
        }
    }
    }

}//END CLASS....Upload_Menu 

向下划分课程

    protected $_uploaded = array();
    protected $_destination;
    protected $_max = 400000;
    protected $_messages = array();
    protected $_permitted = array('image/gif',
                                'image/jpeg',
                                'image/pjpeg',
                                'image/png');
    protected $_renamed = false;

    public function __construct($path) {
    if (!is_dir($path) || !is_writable($path)) {
        throw new Exception("$path must be a valid, writable directory.");
    }
    $this->_destination = $path;
    $this->_uploaded = $_FILES;
    }

    public function move() {
    $field = current($this->_uploaded);
    $success = move_uploaded_file($field['tmp_name'], $this->_destination . $field['name']);
    if ($success) {
        $this->_messages[] = $field['name'] . ' uploaded successfully';
    } else {
        $this->_messages[] = 'Could not upload ' . $field['name'];
    }
    }

    public function getMessages() {
    return $this->_messages;
    }

2 个答案:

答案 0 :(得分:0)

我会采用稍微不同的方法:在创建对象时将特定文件发送到构造函数:

$upload = new Upload_File($_FILES['menu'], $destination);

然后,您将获得课程中所需的所有信息,而无需从班级中访问全局变量。

然后,您可以遍历$_FILES数组以添加每个文件或将其放在不同的类中。

这需要在课堂上进行一些改写,但这样可以使其更加灵活,满足您的需求。

答案 1 :(得分:0)

<强>解决

所以......对于未来可能会遇到这种情况的人来说,这是一个不太优雅但最终有效的解决方案。

pathinfo($string, PATHINFO_EXTENSION)  FTW!

我为我的processFile方法和Wallah添加了排序机制!

protected function processFile($filename, $error, $size, $type, $tmp_name, $overwrite) {
$OK = $this->checkError($filename, $error);
if ($OK) {
  $sizeOK = $this->checkSize($filename, $size);
  $typeOK = $this->checkType($filename, $type);
  if ($sizeOK && $typeOK) {
    $name = $this->checkName($filename, $overwrite);

    /************************ADDED HERE************************************/
    if (pathinfo($filename, PATHINFO_EXTENSION) == 'pdf' || 'doc' || 'docx'){
        $this->_destination = './uploads/menus_up/';
    if (pathinfo($filename, PATHINFO_EXTENSION) == 'png' || 'jpeg' || 'gif'){
        $this->_destination = './uploads/eventBG_up/';  
    /**********************************************************************/

    $success = move_uploaded_file($tmp_name, $this->_destination . $name);
    if ($success) {
        $message = "$filename uploaded successfully";
        if ($this->_renamed) {
          $message .= " and renamed $name";
        }
        $this->_messages[] = $message;
    } else {
      $this->_messages[] = "Could not upload $filename";
     }
   }
  }
 }  
}
}