问题
我想删除AJAX/PHP
的文件。
但是php说我用AJAX发送的文件名不是文件,但是当我直接进入链接时我可以删除文件。查看我当前的PHP,我已经在IF / ELSE语句中检查字符串是否为is_file
文件,结果为false
。
没有is_file
说:
Warning: unlink("image.jpg") [function.unlink]: Invalid argument in C:\wamp\www\images\users\delete.php on line 8
调用ajax的文件位于文件夹中,文件也是我要删除的文件。
PHP
<?php
// I save the file sources from the URL what was sent by AJAX to these variables.
$photo_id = $_GET['photo_id'];
$thumbnail_id = $_GET['thumbnail_id'];
function deletePhotos($id){
// If is a file then delete the file.
if(is_file($id)){
return unlink($id);
// Else show error.
} else {
echo $id . " is not a file, or there is a problem with it.<br />" ;
}
}
if(isset($photo_id)){
deletePhotos($photo_id);
}
if(isset($thumbnail_id)){
deletePhotos($thumbnail_id);
}
?>
AJAX
function deletePhoto(photo, thumbnail){
var photos = encodeURIComponent(photo);
var thumbnails = encodeURIComponent(thumbnail);
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById("media").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET", "http://192.168.2.104/images/users/delete.php?photo_id=\""+photos+"\"&thumbnail_id=\""+thumbnails+"\"", true);
xmlhttp.send();
}
答案 0 :(得分:1)
您的ajax请求包含引号数据。
//Bad
delete.php?photo_id="1234"
//Good
delete.php?photo_id=1234
//So use this:
xmlhttp.open("GET", "http://192.168.2.104/images/users/delete.php?photo_id="+photos+"&thumbnail_id="+thumbnails, true);
答案 1 :(得分:0)
您需要提供is_file的完整路径。像image.jpg这样的部分路径并没有告诉它该文件的位置。如果它应该是相对于文档根目录,那么你需要预先添加它。
这是我见过的最危险的剧本之一。您可以将任何文件传递到photo_id,只要Web服务器具有正确的权限,它就会将其删除。您至少应该确保将其限制为仅删除某个目录中的文件。
答案 2 :(得分:0)
您可能需要指定路径,例如
file_exists( realpath('.') . '/' . $id );
(假设您的文件与脚本位于同一文件夹中)与其他人所说的相同,这是一个危险的脚本,除非有其他安全措施!
答案 3 :(得分:0)
尝试在帖子中使用trim或获取变量,例如:
$photo_id=trim($_GET['blah..blah']);
在我的情况下问题是$photo_id
没有返回文件名 - 它返回类似'\ nfilename'的东西,当它应该是'filename'所以我添加了trim
并且它现在为我工作了