添加删除按钮(取消链接)到上传的文件

时间:2017-01-16 17:54:00

标签: php unlink

我已经制作了一个文件上传表单,以便登录用户可以将文件上传到自定义文件夹(上传/用户/用户名/)。

下面的代码显示了用户上传的所有文件,但是,我一直在努力添加'删除'每个项目的按钮。这是一个严格控制的网站,没有注册,不适用于公共领域,因此安全性不是一个巨大的问题,因为这只会被15-20个用户使用。

我一直在努力整齐地添加unlink。我尝试过网上发现的各种建议,但没有运气,我认为应该看起来像:

<?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);
?>

非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

要为每个文件创建删除按钮,您需要获取该文件的ID和路径,假设您在创建上载功能时已将该信息存储在数据库中。所以这个例子看起来像:

<?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大小的文件)。只是搜索谷歌,有很多关于这个主题的好教程。

为了列出所有上传的文件,对于每个用户,您也可以使用数据库。

<强> 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.php2.html等)通过您的上传功能放置在那里,您已经说过了。 首先,index.phpfiles/目录作为数组读取(仅包含文件名);然后将遍历数组,并检查数组的每个元素是否是一个文件,如果是,则生成一个链接,并将用户重定向回index.php,但这次有一个查询字符串(例如:index.php?remove=1.php)。然后,最后一次检查是否存在名为remove的查询字符串,如果有,则会删除相应的文件并重定向回index.php

答案 1 :(得分: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.