如何编辑文件名并从文件夹中删除图像?

时间:2016-11-27 15:35:36

标签: javascript php

我正在尝试为图像文件名添加编辑选项,并且还删除图像的选项。所有图像都在一个文件夹中,我根本没有使用过数据库。我能够显示图像文件名以及用于编辑和删除每个图像名称旁边的按钮。

但我不确定如何前进。我知道PHP有unlink()rename()个函数。但我不确定如何动态地包含这些功能。

<?php
echo "<div class='container'>";
if(isset($_POST["submit"])) {
    $files = glob("images/Kwebsite/". $_POST['path']."/*.*");
}

echo "<div class='col l5'>";
echo "<h3>Image Filename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Actions</h3>";
echo "</div>";

for ($i=0; $i<count($files); $i++){
    $num = $files[$i];
    $filenamewithextension = basename($num);
    $fileextenstion = pathinfo($filenamewithextension, PATHINFO_EXTENSION);
    $filename = basename($num,$fileextenstion);

    echo '<div class="imagename">';
    echo $filename; 
    echo '<button type="submit" class="btn-flat" value="Delete"  onClick="Delete()">Delete</button>';

    if(isset($_POST["submit"])) {
        $imgfile = glob("images/Kanishk website/". $_POST['path']."/*.*");

        foreach $imgfile as $img {
            unlink($img)
        }
    } 
}
?>

3 个答案:

答案 0 :(得分:5)

您必须将文件路径传递给unlink()。 如果要删除多个文件,则必须多次调用unlink。如果将文件路径推送到数组,则可以遍历路径。

$paths['/files/file1.jpg','/files/file2.jpg']
foreach $paths as $file {
   unlink($file)
}

如果要重命名文件,还必须提供完整路径, 否则你将在其他地方创建一个新文件:

rename ("/files/file1.jpg", "/files/file_1.jpg");

此信息必须由用户提供,至少在大多数情况下是这样。 我建议将路径和文件名存储在数据库中。

答案 1 :(得分:3)

首先,这是一个危险的事情,你在那里做,你应该避免它。想象一下如果有人给出像../../这样的升级点组合会发生什么。该脚本将列出所有2级文件。为了防止这种行为,我们需要检查{em>斜杠和反斜杠path输入字符串,如果有的话,不要执行glob函数找到了斜杠。以下是验证path查询的正则表达式:

// Check for backslash, level up dir .. and wildcards 
$isValidPath = !preg_match('#([\\\.\?\*])#', $path);

我根据你的代码做了一个非常简单的例子。通过将表单数据发布到服务器(而不是AJAX ),将所有命令传递给PHP。当用户点击删除按钮时,会显示一条消息确认,如果用户点击确定,则表单会发布删除按钮数据,即name="delete"value="path/filename.ext" 。我们在PHP中有$_POST['delete'] == "path/filename.ext"值。如果我们在POST数据中检测到delete,那么我们调用unlink并删除该文件。对于重命名功能,我们使用相同的方法,但这次使用javascript提示,提示并要求用户键入新文件名。如果新文件名与原始文件名不同,则它会使用新文件名更新隐藏字段,并将表单字段发布到我们的PHP服务器脚本中; POST数据将包含rename函数$_POST['rename'] == "path/oldfilename.ext"$_POST['renameto'] == "newfilename.ext"的这些值。然后我们只需在脚本的开头调用重命名函数。

提示:使用PHP print_r函数在HTML $_POST中打印<pre></pre>数组,以调试每次刷新页面上的帖子数据:

<pre><?php print_r($_POST) ?></pre>

最终工作脚本

<pre><?php print_r($_POST) ?></pre>

<?php 

$hasPath = isset($_POST['path']);
$basePath = __DIR__."/images/Kwebsite/";
$path = '';
$files = array();

if(isset($_POST['rename']) && isset($_POST['renameto'])) {
    $fileToRename = $basePath.$_POST['rename'];
    $renameTo = dirname($fileToRename).'/'. $_POST['renameto'];
    rename($fileToRename, $renameTo);
}

if(isset($_POST['delete'])) {
    $fileToDelete = $basePath.$_POST['delete'];
    unlink($fileToDelete);
}

if($hasPath) {

    // Check for backslash, level up dir .. and wildcards 
    $path = $_POST['path'];
    $isValidPath = !preg_match('#([\\\.\?\*])#', $path);

    if($isValidPath) {
        $searchPath = $basePath.$path.'/*.*';
        $files = glob($searchPath);
    }
}

?>

<form method="post">
<label>Search directory: </label>
<input type="text" name="path" value="<?php echo $path ?>"/>
<button type="submit">Search</button>

<hr>

<table border="1">
 <thead>
  <tr>
   <th>Image Filename</th><th>Actions</th>
  </tr>
 </thead>
 <tbody>
  <?php if($hasPath && $isValidPath && count($files) > 0): ?>
  <?php foreach($files as $file): 
    $filenameWithExtension = basename($file);
    $fileExtenstion = pathinfo($filenameWithExtension, PATHINFO_EXTENSION);
    $filename = pathinfo($filenameWithExtension, PATHINFO_FILENAME);
  ?>
  <tr>
   <td><?php echo $filename ?></td>
   <td>
    <button type="submit" name="delete" value="<?php echo "{$path}/{$filenameWithExtension}" ?>" onClick="Delete(event)">Delete</button>
    <button type="submit" name="rename" value="<?php echo "{$path}/{$filenameWithExtension}" ?>" onClick="Rename(event)">Rename</button>
   </td>
  </tr>
  <?php endforeach; ?>
  <?php endif; ?>
 </tbody>
</table>

<input type="hidden" id="renameto" name="renameto"/>

</form>

<script type="text/javascript">

function Delete(e) {
    var event = e || window.event,
        filename = event.target.value.substr(event.target.value.lastIndexOf('/') + 1);

    if(!confirm("Are you sure you want to delete this file '"+filename+"'?"))
        event.preventDefault();
}

function Rename(e) {
    var event = e || window.event,
        oldFilename = event.target.value.substr(event.target.value.lastIndexOf('/') + 1),
        newFilename = prompt("Enter a new filename", oldFilename);

    if(newFilename != null) {
        if(newFilename == oldFilename) {
            alert("You must give a different filename");
            event.preventDefault();
        } else {
            document.getElementById('renameto').value = newFilename;
        }
    } else {
        event.preventDefault();
    }
}

</script>

答案 2 :(得分:1)

  

我不确定如何动态地包含这些功能

根据您的问题和您的代码,您似乎能够删除或重命名文件,但正在寻找工作流程建议。

我提出以下建议。如果您需要代码,我很乐意提供我的解决方案,但界面的范围相当大,需要先澄清一些。例如,

  • 您是否有用户导航的目录?
  • 您是否希望用户拥有复选框以检查单个文件(推荐)或者您是否希望它们能够输入文件模式(如示例所示)(危险!)?

我的建议:

使用表格显示文件。在表格上方包括按钮以及#34;删除所选&#34;,&#34;取消&#34;

在表格中包含以下列:

  • 复选框(如果需要,可选择多个文件)
  • 文件名(只是文本,可以是复选框的标签部分)
  • 带文件名的可编辑输入,允许用户重命名
  • 输入按钮=&#34;重命名&#34; (重命名单个文件)
  • 输入按钮=&#34;删除&#34; (删除单个文件)
  • 缩略图可以点击以查看完整尺寸的图像。

该表位于表单中,因此具有<input>属性的每个name将以$_POST结尾。例如,重命名文件并提交文件的输入如下所示:

<td><input type=text name=filer-<?php echo encodestr($filefull) ?> value='<?php echo $name ?>'></td>
<td><input type="submit" name="fprename-<?php echo encodestr($filefull) ?>" value="Rename" onClick='return confirm("Do you want to rename this file?");'></td>

其中$filefull是文件的完整现有路径,$name没有路径。单击重命名按钮时,$_POST将包含每个文件名前缀为filer-的元素,以便我可以轻松识别它们。我知道根据按下的提交按钮重命名或删除哪一个,我可以从var中找出前缀fprename-

因此,如果我从$_POST返回名为$_POST['fprename-/path/myfile.jpg']的var,我会查找输入var $_POST['filer-/path/myfile.jpg']并将文件重命名为其中包含的值(当然先检查具有该名称的文件尚不存在。)

工作流程

删除多个文件

  • 用户通过单击Delete Selected提交按钮,使用复选框选择项目进行删除和提交表单。
  • 表单onSubmit提供了一个javascript alert(),允许取消删除请求。
  • 用户确认后,您想要Post/Redirect/Get(以防止多个表单提交)。这涉及将表单提交给另一个php(例如processFiles.php),该php处理你拥有的unlink()代码,然后重定向回userInterface.php。

删除或重命名单个文件

  • 用户点击各个文件旁边的表格中的提交按钮。
  • 按钮onclick提供了一个javascript alert(),允许取消删除或重命名请求。
  • 用户确认后,表单将提交。同样,你想做一个Post / Redirect / Get,其中另一个php(例如processFiles.php)处理unlink()或重命名代码,然后重定向回userInterface.php。

在以下示例中,我不允许删除多个文件,只选择多个文件 - 因此&#34;选择&#34;顶部的按钮而不是&#34;删除所选&#34;。

Example Interface