Mover um arquivo para uma pasta diferente no servidor

181

Preciso permitir que os usuários do meu site excluam suas imagens do servidor depois de carregá-las, se não quiserem mais. Eu estava usando a unlinkfunção anteriormente em PHP, mas já me disseram que isso pode ser bastante arriscado e um problema de segurança. (Código anterior abaixo :)

if(unlink($path.'image1.jpg')){ 
     // deleted
}

Em vez disso, agora quero simplesmente mover o arquivo para uma pasta diferente. Isso deve ser feito muito tempo após o upload do arquivo pela primeira vez, a qualquer momento que eles fizerem login na conta. Se eu tiver a pasta principal que armazena as imagens dos usuários:

user/

e então dentro dela uma pasta chamada del, que é o destino para colocar suas imagens indesejadas:

user/del/

Existe um comando para mover um arquivo para uma pasta diferente? Então isso diz:

user/image1.jpg

move para / torna-se

user/del/image1.jpg
Pato estranho
fonte

Respostas:

420

A renamefunção faz isso

documentos renomear

rename('image1.jpg', 'del/image1.jpg');

Se você deseja manter o arquivo existente no mesmo local, use copy

cópia de documentos

copy('image1.jpg', 'del/image1.jpg');

Se você deseja mover um arquivo carregado, use o move_uploaded_file, embora isso seja quase o mesmo que renameesta função também verifique se o arquivo fornecido é um arquivo que foi carregado via POST, isso impede, por exemplo, que um arquivo local seja movido

docs move_uploaded_file

$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
    }
}

snipet de código de documentos

MKroeders
fonte
Um problema com renomear () e copiar () é que você perdeu todos os metadados, como data de criação e modificação, por exemplo. Lembre-se disso.
Musikdoktor 28/03
95

Use a função renomear () .

rename("user/image1.jpg", "user/del/image1.jpg");
Ben Fortune
fonte
17

Se você deseja mover o arquivo para um novo caminho, mantenha o nome do arquivo original. usa isto:

$source_file = 'foo/image.jpg';
$destination_path = 'bar/';
rename($source_file, $destination_path . pathinfo($source_file, PATHINFO_BASENAME));
Nabi KAZ
fonte
Funcionou como um encanto.
ucMedia
1

Alguma solução é primeiro copiar () o arquivo (como mencionado acima) e quando o arquivo de destino existir - desvincular () o arquivo da localização anterior. Além disso, você pode validar a soma de verificação MD5 antes de desvincular para ter certeza

quardas
fonte
1

Crie uma função para movê-la:

function move_file($file, $to){
    $path_parts = pathinfo($file);
    $newplace   = "$to/{$path_parts['basename']}";
    if(rename($file, $newplace))
        return $newplace;
    return null;
}
Marcelo
fonte
1

Eu usando shell ler todos os arquivos de dados, em seguida, atribuir a matriz. Então eu movo o arquivo na posição superior.

i=0 
for file in /home/*.gz; do
    $file
    arr[i]=$file
    i=$((i+1)) 
done 
mv -f "${arr[0]}" /var/www/html/
Para Quoc Diep
fonte
Por favor, explique isso mais detalhadamente - como isso poderia funcionar usando PHP?
Nico Haase
0

uso copy () e unlink () função

$moveFile="path/filename";
if (copy($csvFile,$moveFile)) 
{
  unlink($csvFile);
}
Arunprabakaran M
fonte
-4

shell_exec ('mv filename dest_filename');

user10395079
fonte
2
Bem-vindo ao Stack Overflow! Embora esse trecho de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não saber os motivos da sua sugestão de código. Tente também não sobrecarregar seu código com comentários explicativos, pois isso reduz a legibilidade do código e das explicações!
Filnor 21/09/18