2017-01-16 3 views
0

Я создал форму для загрузки файлов, чтобы зарегистрированные пользователи могли загружать файлы в пользовательскую папку (uploads/users/username /).Добавление кнопки удаления (отсоединение) к загруженным файлам

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

Я пытался аккуратно добавить в unink. Я пробовал различные предложения, найденные в Интернете, но не повезло, я думаю, что это должно выглядеть примерно так:

<?php 
$dir_open = opendir('uploads/users/' . $_SESSION['username'] . ''); 
while(false !== ($filename = readdir($dir_open))){ 
    if($filename != "." && $filename != ".."){ 
      $fullpath = "uploads/users/" . $_SESSION['username'] . "/$filename"; 
      echo "<a href='$fullpath' target=\"_blank\"><img src='$fullpath' style='width:350px;border: 1px solid #000;'></a><br /> 
        $filename<br /> 
Delete button--> <a href="$fullpath">Delete file</a> 
        <hr><br />"; 
}}closedir($dir_open); 
?> 

Любая помощь будет высоко оценен

ответ

0

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

<?php 
//... 
$db = new PDO('mysql:host=127.0.0.1;dbname=db_name','db_user','db_pass'); 
$stmt = $db->prepare('SELECT id,filename FROM your_table'); 
while ($row = $stmt->fetch()){ 
?> 
    <a href="delete.php?id=<?php echo $row['id']; ?>">Delete</a> 
<?php 
} 
?> 

Затем в delete.php файле:

if (isset($_GET['id']) && is_numeric($_GET['id'])) { 
    //db connect here 
    $stmt = $db->prepare('DELETE FROM table_name WHERE id=?'); 
    $stmt->execute([$_GET['id']); 
} 

Что касается безопасности, то я не могу сказать вам много о, как я не знаю точно, что вы хотите. Но вы можете проверить тип mime (и разрешить только те типы mime, которые вы хотите), и о размерах файлов (чтобы разрешить только определенные размеры файлов или запретить файлы размером 0). Просто найдите google, есть много хороших уроков по этой теме.

И для перечисления всех загруженных файлов для каждого пользователя вы также можете использовать db.

LE

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

Так что код выглядит следующим образом:

//index.php 
$files = scandir('files'); 
foreach ($files as $file){ 
    if (is_file('files/'.$file)){ 
     ?> 
     <a href="index.php?remove=<?php echo $file; ?>">delete</a> <br> 
     <?php 
    } 
} 

if(isset($_GET['remove'])){ 
    unlink('files/'.$_GET['remove']) ? header('Location: index.php') : print 'Not Removed<br>'; 
} 

Я использовал chmod 777 -R files/, прежде чем пытаться код. Я действительно не знаю, хороший ли это подход.

LE2

Структура каталогов Я использовал для этого примера:

project/ 
    files/ 
     1.php 
     2.html 
     3.css 
     4.js 
    index.php 

Эти файлы (1.php, 2.html и т.д.) размещены там вашей функциональности загрузки, вы сказали у тебя уже есть. index.php будет, прежде всего, считать, что files/ каталог как массив (содержащий только имена файлов); затем будет проходить через массив и проверять, является ли каждый элемент массива файлом, а если он есть, то он будет генерировать ссылку и перенаправлять пользователя обратно на index.php, но на этот раз имеет строку запроса (например: index.php?remove=1.php). Затем последний вопрос проверки, если есть строка запроса с именем remove, и если она есть, она удалит соответствующий файл и перенаправит обратно на index.php.

+0

Привет, Dan, у меня уже есть полный путь к файлу в '$ fullpath'. Я не использую db для файлов, поэтому я считаю, что «unlink()» - это способ пойти с этим. У меня есть аналогичная настройка, которую я использую дома в своей интрасети, и которая использует предварительно построенную систему с db для обработки всех логинов/файлов и прекрасно работает, однако в этом случае не подходит, поскольку сайт, над которым я работаю ограничивается одним db и уже используется. Я знаю, что это можно сделать без db, но я читал каждый результат на первых 5 страницах Google, и ни одна из них не помогает в этом обстоятельстве. – noozl

+0

@noozl Взгляните на мою LE. –

+0

Я все еще не могу реализовать это с помощью моего текущего кода. Я не так хорош в PHP, поэтому немного борюсь с этим. Любые указатели на то, где разместить что? – noozl

0
I think what you need is make sure that when saving the file, you create a unique name to save the file by changing the file name to something of such 
    <?php 
    $fileExtension = pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION); 
    $filename=uniqid('upload_').rand(10000,9999999).date('ymdHis').rand(10000,9999999).'.'.$fileExtension; 
?> 

    use this as the file name (containing the name and the extension) you are saving to ur db and move the file to a folder. 

    To delete, the delete.php will pass the filename as a get method or using ajax to send the file name to your delete.php 

    such that in delete.php, you will then 

    `1. query to delete the file using filename from db 
    2. if success, then use the unlink to delete from path such that you do something of this nature 
    <?php 
    unlink(Path_of_uploaded_files/filename); 
?> 

    I can provide an example later. 
Смежные вопросы