我正在尝试为图像文件名添加编辑选项,并且还删除图像的选项。所有图像都在一个文件夹中,我根本没有使用过数据库。我能够显示图像文件名以及用于编辑和删除每个图像名称旁边的按钮。
但我不确定如何前进。我知道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 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)
}
}
}
?>
答案 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;
在表格中包含以下列:
该表位于表单中,因此具有<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()
,允许取消删除请求。删除或重命名单个文件
onclick
提供了一个javascript alert()
,允许取消删除或重命名请求。在以下示例中,我不允许删除多个文件,只选择多个文件 - 因此&#34;选择&#34;顶部的按钮而不是&#34;删除所选&#34;。