在用户之间共享文件

时间:2019-04-20 16:15:37

标签: php html mysqli

我创建了一个基于PHP MySQL的应用程序,并且正在使用XAMP服务器。目前,我已经为用户创建了注册和登录功能,用户可以上传和下载自己的文件。所有文件都存储在uploads /文件夹中。我已经使用用户ID将这些文件存储在另一个表中。因此,一个表用于存储用户详细信息,另一个表用于根据用户ID存储用户的文件。现在,我想创建允许用户将文件共享给另一个用户的功能。

当我提取一个用户上传的所有文件时,我试图在显示“共享”的文件旁边显示一个按钮,该按钮将向用户发送文件名,但是我不确定如何传递其他用户的ID我想与谁共享文件,以及与谁共享文件,如何将文件共享给所选用户。 下面是用于显示已登录的用户文件的代码以及可以实现共享的链接。

while ($row = mysqli_fetch_array($result)){ 
        $filename = $row['file'];
        $filetype = $row['type'];
        $filesize = $row['size'];
        echo "
        <tr>
        <td>$filename</td>
        <td>$filetype</td>
        <td>$filesize KB</td>
        <td><a href='uploads/$filename' target='_blank'> Download file </br></td>
        <td><a href='delete.php?del=$filename' class='link'>Delete</td> 
        <td> <a href='shareFile.php?share=$filename' class='shareFile'>Share File </td>
        </tr>";



    }

}
else {
    echo "<p>NO FILES UPLOADED YET</p>";
}

下面是用户表:

CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `username` varchar(100) NOT NULL,
  `password` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

用户赞扬的文件根据用户的ID存储在user_files中。下表是user_files表的表:

CREATE TABLE `user_files` (
  `id` int(11) NOT NULL,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
  `file` longtext NOT NULL,
  `uploaded_on` datetime NOT NULL,
  `type` varchar(30) NOT NULL,
  `size` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

3 个答案:

答案 0 :(得分:1)

首先,我看不到user_files表中有用户拥有该文件的引用。

在添加该列之后,我建议创建一个新表,该表将与谁共享信息。完整的数据库应如下所示:

用户:

CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `username` varchar(100) NOT NULL,
  `password` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

用户文件:

CREATE TABLE `user_files` (
  `id` int(11) NOT NULL,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
  `file` longtext NOT NULL,
  `uploaded_on` datetime NOT NULL,
  `type` varchar(30) NOT NULL,
  `size` int(11) NOT NULL.
  `user_id` int(11) NOT NULL REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

与以下人共享:

CREATE TABLE `shared_files` (
  `id` int(11) NOT NULL,
  `file_id` int(11) NOT_NULL REFERENCES user_files(id) ON DELETE CASCADE
  `with_user_id` int(11) NOT NULL REFERENCES users(id) ON DELETE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

希望它会有所帮助:)

答案 1 :(得分:1)

在这种情况下,我建议您向用户文件表中添加另一个字段(列)。该字段可以称为“ shared_users_id”,并且应包含逗号分隔的共享用户ID列表。对于Ex。

表:user_files

---------------------------------------
id | user_id | file | shared_users_id |
---------------------------------------
1  |1        |sample.jpg|2,3,4        |
---------------------------------------

更新1:

点击共享按钮时,您可以首先发出AJAX请求,其中列出了可供共享

使用的用户名
<?php
   // Select all from users
   if(mysqli_num_rows($query) {
      echo '<ul>';
      while($users_lists = mysqli_fetch_assoc($query)) {
         echo '<li data-id="'.$users_lists['id'].'">'.$users_lists['name'].'</li>';
      }
      echo '</ul>';
   }

每个列表都应包含共享的ID,因此,当共享者单击任何用户时,再次发出一个POST请求(可能是AJAX请求),该请求应包含共享用户的ID,然后从$_POST处理块并执行以下操作。对于Ex,我们首先假定您在共享者单击 Share按钮时获取了用户列表。

// jQuery
$("#ajaxUserLists li").click(function(e) {
let user_id = $(this).data('id');
$.post( "handle-share.php", {user_id: user_id});
});
<ul id="ajaxUserLists">
<li data-id="1">Vishal Limbachiya</li>
<li data-id="2">Erisan Olasheni</li>
<li data-id="3"></li>
</ul>

因此,要获取共享文件的用户列表,可以调用PHP explode函数将列表转换为数组,添加新用户,可以执行array-push ,要删除共享用户,您可以执行unset,然后使用implode函数转换回用逗号分隔的字符串并更新数据库。

在代码中:handle-share.php

<?php
    // Check if the AJAX request has been made
    if (isset($_POST['user_id']) {
       // request made
    // assuming that you retrieved the shared users list string into 
    // $shared_users_id variable
    $shared_users_id = $row['shared_users_id'];

    // Firstly turn if to array
    $shared_users = explode(",",trim($shared_users_id));

    // To add shared users
    $new_id = $_POST['user_id'];
    $shared_users[] = $new_id;

    // To remove a shared_user
    $user_id_to_remove = $_POST['user_id'];
    unset($shared_users[$user_id_to_remove]);

    //Convert back to comma separated string and
    // save to database

    $shared_users_id = implode(",",$shared_users);

    // Update the database table
    ...
}

?>

更新2:

查找当前用户的共享项目

要通知用户文件已与他共享,最好创建一个与user_files表有关系的新表,每当文件共享给用户时,创建的选项卡都会存储详细信息用户,它记录name, time_shared, sharer_id, shared_user_id, is_seenis_seen字段告诉共享用户是否已经看到共享文件(以创建文件共享通知系统)。但是出于我们表结构的目的,您可以运行类似以下的PHP查询:

...
$current_user_id = 4;
$query = mysqli_query($conn, "select user_id, file from user_files where find_in_set($current_user_id,shared_users_id) <> 0");

// number of shared files
$number_of_shared_files = mysqli_num_rows($query);
// list all shared items and sharer_id
while($results = mysqli_fecth_assoc($query) {
      echo $results['file'].' '.$results['user_id'];
}
?>

答案 2 :(得分:1)

根据问题中的每个用户问题 我如何将用户ID发送到share.php文件,以便您可以将用户ID与文件一起保存

解决方案是,您必须创建一个公共表,其中包含带有共享文件的用户ID

CREATE TABLE shared_files (
   id int(11) NOT NULL,
   file_id int(11) NOT_NULL REFERENCES user_files(id) ON DELETE CASCADE
   with_user_id int(11) NOT NULL REFERENCES users(id) ON DELETE CASCADE
) 

现在使用共享按钮,您必须从下拉列表中选择一个用户,因此您的代码可能是

while ($row = mysqli_fetch_array($result)){ 
        $filename = $row['file'];
        $filetype = $row['type'];
        $filesize = $row['size'];
        echo "
        <tr>
        <td>$filename</td>
        <td>$filetype</td>
        <td>$filesize KB</td>
        <td><a href='uploads/$filename' target='_blank'> Download file </br></td>
        <td><a href='delete.php?del=$filename' class='link'>Delete</td>
        <td><select id='userSelectId'>".
        while ($row = mysqli_fetch_array($users)){
          "<option value='".$users['id']."'>".$users['username']."</option>"
        }
        ."</select></td>
        <td> <a href='shareFile.php?share=$filename&userId=$('#userSelectId option:selected').val()' class='shareFile'>Share File </td>
        </tr>";
    }

我认为,这将为您提供基本的想法,即如何在点击共享链接上将UserId发送到数据库