Делитесь файлами между пользователями - PullRequest
0 голосов
/ 20 апреля 2019

Я создал приложение, основанное на PHP MySQL, и я использую сервер XAMP. В настоящее время я создал функции регистрации и входа для пользователей, и пользователи могут загружать и скачивать свои собственные файлы. Все файлы хранятся в папке загрузки /. Я сохранил эти файлы, используя идентификатор пользователя в другой таблице. поэтому одна таблица предназначена для хранения сведений о пользователях, а другая - для хранения файлов пользователей в соответствии с их идентификатором. Теперь я хочу создать функциональность, которая позволит пользователю поделиться файлом с другим пользователем.

Когда я выбираю все файлы, загруженные пользователем, я пытался показать кнопку рядом с файлом с надписью «поделиться», эта кнопка отправляет имя пользователя, но я не уверен, как я передам идентификатор другого пользователя с кому я хочу предоставить доступ к файлу и как передать его, как я могу предоставить доступ к файлу выбранному пользователю. ниже приведен код для отображения файла авторизованных пользователей и ссылка, через которую можно реализовать общий ресурс.

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;

Файлы, которые пользователь загружает, хранятся в 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 ]

1 голос
/ 20 апреля 2019

В этом случае я могу предложить добавить другое поле (столбец) в таблицу пользовательских файлов.Это поле может называться «shared_users_id» и должно содержать разделенные запятыми списки идентификаторов общих пользователей.Например:

Таблица: user_files

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

Обновление 1:

Когда нажата кнопка доля , выможет сначала сделать запрос AJAX, чтобы список имен пользователей был доступен для shared

<?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>';
   }

, каждый список должен содержать идентификаторы общих ресурсов, поэтому, когда участник нажимает на любого пользователя,другой запрос POST (возможно, с AJAX), который содержит идентификатор общего пользователя, затем извлекает этот идентификатор из блока дескриптора $_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_seen, поле is_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'];
}
?>
1 голос
/ 20 апреля 2019

Хорошо, согласно пользовательской проблеме в вопросе. как я могу отправить идентификатор пользователя в файл share.php, чтобы вы могли сохранить идентификатор пользователя с файлом

Таким образом, решение заключается в том, что вы должны создать общую таблицу, содержащую идентификаторы пользователей с общим файлом

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 в базу данных по ссылке «поделиться»

1 голос
/ 20 апреля 2019

Во-первых, я не вижу, чтобы в таблице user_files была ссылка, кому принадлежит файл.

После добавления этого столбца я бы предложил создать новую таблицу, в которой будет указана информация о том, кто fileId будет предоставлен кому из пользователей. Полная база данных должна выглядеть так:

Пользователи:

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;

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...