将上传的文件移动到登录的用户文件夹

时间:2014-03-03 16:39:27

标签: php

你好,所以这里有一个问题我有一个登录/注册系统,当用户创建他的帐户时,会创建一个与他输入用户名相同名称的新文件夹,所以如果用户名为test123,则会创建一个文件夹test123。现在的问题是我不知道如何将用户上传的文件与上传系统一起移动到他的目录中。并且在注册甚至上传文件后,必须将用户插入。

这是upload.php

<?php
if($_POST[submit]) {
    $name = $_FILES['upload']['name'];
    $temp = $_FILES['upload']['tmp_name'];
    $type = $_FILES['upload']['type'];
    $size = $_FILES['upload']['size'];

    if($size <= 5000000){

        move_uploaded_file($temp,"userfiles/$name");
        echo "File: $name was uploaded!";

    } else{
        echo "Wrong size!";
    }
} else {
    header("Location: mojprofil.php");
}
?>

如此实际位于 userfiles 文件夹中的move_uploaded_file($temp, "userfiles/$name");,每个注册用户都有一个文件夹

这是register.php:

<?php

require_once 'core/init.php';



if(input::exists()) {
    if(Token::check(Input::get('token'))) {
        $validate = new Validate();
        $validation = $validate->check($_POST, array(
            'username' => array(
                'required' => true,
                'min' => 2,
                'max' => 20,
                'unique' => 'users'
            ),
            'password' => array(
                'required' => true,
                'min' => 6
            ),
            'password_again' => array(
                'required' => true,
                'matches' => 'password'
            ),
                'name' => array(
                'required' => true,
                'min' => 2,
                'max' => 50
            )
        ));

        if($validation->passed()) {
            $user = new User();

            $salt = Hash::salt(32);


            try {
                $user_dir = Input::get('username');

                $user->create(array(
                    'username' => Input::get('username'),
                    'password' => Hash::make(Input::get('password'), $salt),
                    'salt' => $salt,
                    'name' => Input::get('name'),
                    'joined' => date('Y-m-d H:i:s'),
                    'group' => 1
                ));
                Session::flash('home', '<h3>Registracija uspešna!</h3>');
                mkdir(__DIR__.'/userfiles/'.$user_dir);
                Redirect::to('mojprofil.php');

            } catch (Exception $e) {
                die($e->getMessage());
            }
        } else {
            foreach($validation->errors() as $error) {
                echo $error, '<br>';
            }
        }
    }
}

?>

2 个答案:

答案 0 :(得分:0)

根据我的经验,在设置任何给定目录的上传路径时,我总是使用完整的服务器路径。

所以不要这样:

move_uploaded_file($temp,"userfiles/$name");

试试这个:     ... $ tmp_filename = $ _FILES ['yourFile] ['tmp_name']

move_uploaded_file($tmp_filename,'/your/full/server/path/userfiles/'.$name);

此外,如果您的用户必须登录,我假设您可能会跟踪他们的用户ID或某种会话变量中的唯一内容。 如果您根据_FILES变量设置目录名称,我认为您可能会面临获取与用户ID /用户名不匹配的文件夹名称的风险。

在我看来,最好先从某种查询中获取用户名以确保所有内容都匹配。例如:

$username = get_user($_SESSION['user_id');  // returns user data -> id, username etc...

move_uploaded_file($tmp_filename,'/your/full/server/path/userfiles/'.$username);

这会给你类似的东西:

/public_html/foo/bar/userfiles/username/

答案 1 :(得分:0)

这是非常非常粗略但是这些内容:

$user_data = array();
$user_data['username'] = $_POST['username'];
...
...
// Logic to clean data before insert into DB.

$user = create_user($user_data);  // Return username, id or something unique.
if ($user) { // This contains username or false
    // Create directory with returned username then upload file
   ...
   ...
   // Logic to prep the file for upload
   move_uploaded_file($tmp_filename,'/your/full/server/path/userfiles/'.$user);
}