PHP: mover un archivo a una carpeta diferente en el servidor

182

Necesito permitir que los usuarios de mi sitio web eliminen sus imágenes del servidor después de haberlas cargado si ya no las quieren. Anteriormente estaba usando la unlinkfunción en PHP, pero desde entonces me han dicho que esto puede ser bastante arriesgado y un problema de seguridad. (Código anterior a continuación :)

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

En cambio, ahora solo quiero mover el archivo a una carpeta diferente. Esto debe poder hacerse mucho tiempo después de haber cargado el archivo por primera vez, de modo que cada vez que inicien sesión en su cuenta. Si tengo la carpeta principal que almacena las imágenes de los usuarios:

user/

y luego dentro de eso una carpeta llamada del que es el destino para poner sus imágenes no deseadas:

user/del/

¿Hay un comando para mover un archivo a una carpeta diferente? Entonces eso dice:

user/image1.jpg

se mueve a / se convierte

user/del/image1.jpg
Pato extraño
fuente

Respuestas:

421

La renamefunción hace esto

docs renombrar

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

Si desea mantener el archivo existente en el mismo lugar, debe usar copy

copia de documentos

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

Si desea mover un archivo cargado, use el move_uploaded_file , aunque esto es casi lo mismo, ya que renameesta función también verifica que el archivo dado sea un archivo que se cargó a través de POST, esto evita, por ejemplo, que se mueva un archivo local.

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

fragmento de código de documentos

MKroeders
fuente
Un problema con rename () y copy () es que perdió todos los metadatos, como la fecha de creación y modificación, por ejemplo ... tenga eso en mente.
Musikdoktor
96

Use la función rename () .

rename("user/image1.jpg", "user/del/image1.jpg");
Ben fortuna
fuente
17

Si desea mover el archivo en una nueva ruta con mantener el nombre del archivo original. utilizar este:

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

Alguna solución es primero copiar () el archivo (como se mencionó anteriormente) y cuando exista el archivo de destino: desvincular el archivo () de la localización anterior. Además, puede validar la suma de comprobación MD5 antes de desvincular para asegurarse

quardas
fuente
1

Crea una función para moverla:

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

Utilizando shell, leo todos los archivos de datos y luego los asigno a la matriz. Luego muevo el archivo en la posición superior.

i=0 
for file in /home/*.gz; do
    $file
    arr[i]=$file
    i=$((i+1)) 
done 
mv -f "${arr[0]}" /var/www/html/
A Quoc Diep
fuente
Por favor, explique más: ¿cómo podría funcionar esto usando PHP?
Nico Haase
0

uso de copia () y unlink () función

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

shell_exec ('mv filename dest_filename');

usuario10395079
fuente
2
¡Bienvenido a Stack Overflow! Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código. Por favor, también trate de no saturar su código con comentarios explicativos, ¡esto reduce la legibilidad tanto del código como de las explicaciones!
Filnor