【问题标题】:Delete Image Files From Server从服务器中删除图像文件
【发布时间】:2012-05-08 13:20:35
【问题描述】:

我想知道是否有人可以帮助我。

我整理了this 页面,允许用户以图库格式查看他们上传的图像。

我现在想为每张图片添加删除功能。我已经创建了按钮和它背后的 Javascript,但我真的不确定如何将“按钮单击”与文件的实际物理删除联系起来。

图像没有存储在数据库中,而是位于我服务器上的两个文件夹位置,结构如下:

UploadedFiles/username/locationid/imagename 和

UploadedFiles/username/locationid/Thumbnails/imagename

我对 PHP 比较陌生,现在我已经达到了我的知识极限,但我肯定愿意学习。从我读过的文档中,我认为我说unlink 方法是正确使用的命令是正确的?

但我发现真正困难的是告诉代码找到与当前username 和locationid 匹配的username 和locationid 文件夹的文件夹,然后删除与@987654329 匹配的文件@name 变量。

我只是想知道是否有人可以就我如何解决这个问题提供一些指导。

非常感谢和亲切的问候

【问题讨论】:

    标签: php delete-file


    【解决方案1】:

    如果您可以将用户名、locationid 和 imagename 变量传递给脚本,则可以使用 unlink() 删除文件:

    $path = 'UploadedFiles/' . $username . '/' . $locationid . '/';
    
    unlink( $path . $imagename );
    unlink( $path . 'Thumbnails/' . $imagename );
    

    因为您正在与文件系统进行交互,所以您需要确定并清理变量(防止有人使用 ../../../ 访问文件系统中不需要的部分)。

    $username = str_replace( array( '..', '/', '\\', ':' ), '', $username );
    $imagename = str_replace( array( '..', '/', '\\', ':' ), '', $imagename );
    $locationid= str_replace( array( '..', '/', '\\', ':' ), '', $locationid );
    

    【讨论】:

    • 您可能还想确保在文件名中转义 .. 字符,否则您可能会出现类似“../../../public/index.php”的内容
    • 我不知道是不是不用提,所以我要提一下:您的代码应该结构化,以便变量清理行在 $path= 和 unlink() 行之前运行。
    • 嗨@PaulBain 和@Set Sail Media。非常感谢您对此的帮助。我已经在按钮单击操作中添加了我认为应该去的代码?但是当我添加以spath 开头的代码时,我的图像软件会受到影响并且我失去了Thumbnail 功能。我也想知道,请原谅我问了一个初学者问题,当我直到稍后在我的脚本中才声明它时,是否可以使用$imagename,准确地说是从<a href="<?php echo $source; ?>">开始的第124行我已经更新了我的链接以反映我所做的更改。亲切的问候
    • 我知道你做了什么,不幸的是这不起作用,你不能简单地将代码包含在你的主索引文件中。它将在处理其余输出时运行,这不是您想要的效果。要实现您所追求的行为,您需要单独使用 PHP 文件中的代码,然后使用 AJAX(或其他一些请求)调用该 PHP 文件并将变量包含在您的请求中。
    • 我们希望 PHP 仅在单击按钮时运行,我们需要通过将访问者发送到另一个页面来执行此操作 (delete.php?username=XX&imagename=YY&locationid=ZZ ) 或使用 JavaScript (我更喜欢 jQuery 库) 在后台 (AJAX) 处理请求。见这里:api.jquery.com/jQuery.post
    【解决方案2】:

    显然,您的 javascript(客户端)必须调用 URL(服务器端)才能删除用户选择的图片。我建议你现在静态地做(如果以后你想转向更动态的东西,那么转换成 ajax 的步骤相当小。

    正如 Set Sail Media 所说,您必须在单击删除按钮时将用户名和 locationID 传递给您的服务器。一种方法是:

    当您在 HTML/javascript 中呈现您的画廊时,对于每张图片,您在其下方都有一个包含所需信息的按钮,并且提交按钮将简单地从您的服务器调用删除脚本。你可以做的一个例子是:

        <form name="deleteImageX" method="GET" target="your.server.org/deleteImage.php">
            <input type="hidden" name="userName" value="theUserNameAssociatedWithThePicture" />
            <input type="hidden" name="locationId" value="locationOfThePicture" />
            <input type="submit" value="delete"/>
        </form>
    

    此表单会将所需的值存储在隐藏字段中,这些字段不会显示在网页上,但在按下提交按钮时仍会发送到服务器。

    (对于这个小故事,这里使用的方法是 GET,因为 AFAIK HTML 不支持 DELETE 方法(这在我们的案例中本来是合适的)。

    GET 方法将调用脚本“your.server.org/deleteImage.php”。在此脚本中,您将拥有使用 $_GET['username'] 和 $_GET['locationId'] 变量删除图像所需的所有信息(用户名/locationId)。然后正如您提到的,您将需要使用 unlink 方法从服务器中实际删除文件。

    最后,完成此操作后,您需要重定向 php 脚本,以便在删除图像后再次显示图库(例如)。如果你有某种模板引擎,这可以通过调用脚本来完成,或者通过调用 php 的“header”函数来完成。

    我希望这个流程是您所期望的,我希望我对您有所帮助。

    问候,

    熊

    【讨论】:

    • 嗨@bear foot,非常感谢您花时间解释所有这些,非常感谢。正如我在原始帖子中所说,我对此真的很陌生,所以我可能需要一些时间来消化您提供的技术细节。所以稍后我可能会有一些问题。亲切的问候
    • 没问题。慢慢来,享受 PHP,当然没有愚蠢的问题。如果您在 php.net(这是一本非常好的 php 圣经)或 Google 上找不到直接的答案,请随时提问。 BR,熊
    • 非常感谢@bear foot,我只是在看 php.net,这很有趣。亲切的问候
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2012-11-06
    相关资源
    最近更新 更多