Pergunta

O problema


Eu quero excluir um arquivo com AJAX/PHP.

Mas o PHP diz que o nome do arquivo o que envio com o Ajax não é um arquivo, mas quando vou diretamente para o link, posso excluir os arquivos. Confira meu PHP atual, eu coloquei a instrução if/else para verificar se a string é um arquivo com: is_file, o resultado é false.

Sem is_file diz isso:

Warning: unlink("image.jpg") [function.unlink]: Invalid argument in C:\wamp\www\images\users\delete.php on line 8

O arquivo O que chama de Ajax está dentro da pasta onde estão os arquivos também o que eu quero excluir.

O 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);
    }

 ?>

O 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();
    }
Foi útil?

Solução

Sua solicitação de Ajax possui os dados nas cotações.

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

Outras dicas

  • Você precisa dar um caminho completo para o IS_FILE. Um caminho parcial como o Image.jpg não conta onde esse arquivo está localizado. Se deveria ser relativo à raiz do documento, você precisará precender isso.

  • Este é um dos scripts mais perigosos que eu já vi. Você pode passar qualquer arquivo para o Photo_ID e, desde que o servidor da Web tenha as permissões corretas, ele o excluirá. Você deve pelo menos garantir que esteja restringindo apenas para excluir arquivos em um determinado diretório.

Pode ser necessário especificar o caminho, por exemplo

file_exists( realpath('.') . '/' . $id );

(Supondo que seus arquivos estejam na mesma pasta que o seu script) Idem o que os outros disseram, este é um script perigoso, a menos que haja outra segurança!

Tente usar o TRIM em sua postagem ou obtenha variável, ex:

$photo_id=trim($_GET['blah..blah']);

No meu caso, o problema é $photo_id Retorna nenhum nome de arquivo - seu retorna algo assim ' nfileName', quando deve ser 'nome do arquivo', então eu adicionei trim E isso funcionou para mim agora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top