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

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


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


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

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


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

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/

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

-4

shell_exec ('mv filename dest_filename');


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.