2016-03-12 2 views
4

У меня есть PHP-скрипт, где вы можете загружать файлы. Эти файлы отображаются в списке и преобразуются в ссылку загрузки. Последнее, что мне нужно, это кнопка удаления для каждого элемента списка. Как такКак я могу сделать кнопку unlink в PHP

  • test.txt X

(Большой X должна быть кнопка удаления).

Это мой код.

<?php 

    if(isset($_FILES['file_array'])){ 
    $name_array = $_FILES['file_array']['name']; 
    $tmp_name_array = $_FILES['file_array']['tmp_name']; 
    $type_array = $_FILES['file_array']['type']; 
    $size_array = $_FILES['file_array']['size']; 
    $error_array = $_FILES['file_array']['error']; 
    for($i = 0; $i < count($tmp_name_array); $i++){ 
     if(move_uploaded_file($tmp_name_array[$i], "uploads/".$name_array[$i])){ 
     } else { 
      echo "move_uploaded_file function failed for ".$name_array[$i]."<br>"; 
     } 
    } 
    } 


    $thelist = ""; 
    if ($handle = opendir('uploads')) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file != "." && $file != "..") { 
       $thelist .= '<li><a download="'.$file.'"href="uploads/'.$file.'">'.$file.'</a></li>'; 
      } 
     } 
    closedir($handle); 
    } 
?> 

<h1>List:</h1> 
<ul><?php echo $thelist; ?></ul> 

Im совершенно новый с PHP, поэтому я надеюсь, что кто-то может объяснить мне, как это работает на простом языке.

ответ

1

Последняя вещь, что мне нужно, это удаление кнопки для каждого элемента списка

Post значение через форму:

<form method="post" action="delete.php"> 
    <button type="submit" name="file_id" value="some_value">&times;</button> 
</form> 

А потом в delete.php, ссылка $_POST['file_id'].

Другой метод обернуть while петлю в виде:

<form method="post" action="delete.php"> 
    <?php while(...): ?> 
    <button type="submit" name="file_id" value="some_value">&times;</button> 
    <?php endwhile; ?> 
</form> 
+1

HTTP-метод GET не рекомендуется для действий, которые имеют такой эффект. Вместо этого он должен использоваться только для извлечения некоторых данных. https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_methods – alepeino

+0

Я согласен с Алехандро. Очень рискованный и небезопасный метод. – manniL

+0

@Alejandro Хорошая точка. – rybo111

0

Вы можете добавить ссылку X для ссылки на файл, который будет удален т.е.

$thelist .= '<li><a download="'.$file.'"href="uploads/'.$file.'">'.$file.' </a> <a href="delete.php?item='.$file.'"> X </a></li>'; 

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

$file = $_GET['item']; 
if (!unlink($file)) 
    { 
    echo ("Error deleting $file"); 
    } 
else 
    { 
    echo ("Deleted $file"); 
} 

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

base64_encode($file) 

А на странице удаления вы расшифровать

base64_decode($_GET["item"]) 
+0

Хорошо, я понимаю. Вначале это не сработало, но я изменил расположение файла delete.php в каталог uploads. (и, конечно, в коде я меняю путь delete.php.Я могу работать дальше с этим кодом. :) –

+0

@StijnWesterhof Проверьте мой ответ вверху, я добавил ** X ** для удаления файла. или вам нужно, чтобы это была кнопка? –

+0

Это не только уязвимо для атак CSRF. Он также уязвим для атак на обход каталога, что делает этот код «действительно плохой идеей». – PeeHaa

0

Для того, чтобы создать запрос для удаления элемента, вы может, например:

<form action="delete.php" method="POST"> 
    <input type="hidden" name="csrf_token" value="$csrf_token"> 
    <input type="hidden" name="file" value="$file">  
    <button type="submit">X</button> 
</form> 

в основном $csrf_token является безопасным случайным маркером, который привязан к сеансу, который сервер должен подтвердить перед тем процем ssing запрос на удаление. (Обновлено относительно проблем безопасности CSRF @PeeHaa.) (Вы можете использовать метод DELETE, если вы его поддерживаете.)

+0

Это позволяет случайным людям обмануть пользователя при удалении случайных файлов из-за уязвимости CSRF вы только что представили. – PeeHaa

+0

@PeeHaa Хорошая точка. Ответ обновлен. – alepeino

Смежные вопросы